前言
Redis 是目前最流行的内存数据库,凭借极高的读写性能和丰富的数据结构,被广泛应用于缓存、消息队列、分布式锁等场景。本文将系统讲解 Redis 的五大核心数据类型及其常用命令,帮助你快速上手。
一、Redis 数据类型总览
| 数据类型 | 底层结构 | 典型应用场景 |
|---|---|---|
| String | SDS(简单动态字符串) | 缓存、计数器、分布式锁 |
| Hash | ziplist / hashtable | 对象存储、用户信息 |
| List | quicklist(ziplist + 链表) | 消息队列、文章列表 |
| Set | intset / hashtable | 标签、共同好友、去重 |
| ZSet | ziplist / skiplist + hashtable | 排行榜、延迟队列 |
二、String(字符串)
String 是 Redis 最基础的类型,一个 key 对应一个 value,最大支持 512MB。
2.1 基本命令
# 设置值
SET name "redis"
SET name "redis" EX 30 # 30秒过期
SET name "redis" PX 30000 # 30000毫秒过期
SET name "redis" NX # 仅当key不存在时设置
SET name "redis" XX # 仅当key存在时设置
# 获取值
GET name # "redis"
# 批量操作
MSET k1 "v1" k2 "v2" k3 "v3"
MGET k1 k2 k3 # 1) "v1" 2) "v2" 3) "v3"
# 追加
APPEND name " tutorial" # "redis tutorial"
# 长度
STRLEN name # 14
# 自增自减(值必须是数字)
SET counter 100
INCR counter # 101
INCRBY counter 10 # 111
DECR counter # 110
DECRBY counter 20 # 902.2 实战:页面访问计数器
# 每次访问页面自增
INCR page:home:views # 1
INCR page:home:views # 2
INCR page:home:views # 3
# 获取今日访问量(按日期分key)
INCR page:home:views:20260724 # 1
# 设置过期时间,自动清理历史数据
EXPIRE page:home:views:20260724 864002.3 实战:分布式锁(简单版)
# 加锁:SET NX 保证原子性
SET lock:order:1001 "uuid-xxx" NX EX 30
# 释放锁(需要Lua脚本保证原子性)
# eval "if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:order:1001 uuid-xxx三、Hash(哈希)
Hash 是一个键值对集合,特别适合存储对象。
3.1 基本命令
# 设置字段
HSET user:1001 name "张三"
HSET user:1001 age 25
HSET user:1001 email "zhangsan@example.com"
# 批量设置
HMSET user:1002 name "李四" age 30 email "lisi@example.com"
# 获取字段
HGET user:1001 name # "张三"
HMGET user:1001 name age # 1) "张三" 2) "25"
# 获取所有字段
HGETALL user:1001
# 1) "name"
# 2) "张三"
# 3) "age"
# 4) "25"
# 5) "email"
# 6) "zhangsan@example.com"
# 获取所有字段名/值
HKEYS user:1001 # name, age, email
HVALS user:1001 # 张三, 25, zhangsan@example.com
# 字段数量
HLEN user:1001 # 3
# 删除字段
HDEL user:1001 email
# 字段自增
HINCRBY user:1001 age 1 # 263.2 实战:购物车
# 添加商品到购物车(user:1001 的购物车)
HSET cart:1001 product:2001 2 # 商品2001,数量2
HSET cart:1001 product:2002 1 # 商品2002,数量1
# 修改数量
HINCRBY cart:1001 product:2001 1 # 数量+1 → 3
# 查看购物车
HGETALL cart:1001
# 移除商品
HDEL cart:1001 product:2002
# 清空购物车
DEL cart:1001四、List(列表)
List 是有序的字符串列表,支持在头部或尾部插入/弹出元素。
4.1 基本命令
# 左/右推入
LPUSH messages "msg1" "msg2" # 列表: msg2, msg1
RPUSH messages "msg3" # 列表: msg2, msg1, msg3
# 左/右弹出
LPOP messages # "msg2"
RPOP messages # "msg3"
# 查看范围
LRANGE messages 0 -1 # 所有元素
LRANGE messages 0 2 # 前3个
# 长度
LLEN messages
# 按索引获取
LINDEX messages 0 # 第一个元素
# 按索引设置
LSET messages 0 "new_msg"
# 阻塞弹出(消息队列核心命令)
BLPOP queue:task 30 # 阻塞最多30秒
BRPOP queue:task 304.2 实战:简单消息队列
# 生产者:推入任务
LPUSH queue:email '{"to":"a@b.com","subject":"Hello"}'
# 消费者:阻塞式弹出任务
BRPOP queue:email 0 # 0表示永久阻塞
# 优点:简单、原子性
# 缺点:无ACK机制,消息丢失需自行处理五、Set(集合)
Set 是无序的、不重复的字符串集合。
5.1 基本命令
# 添加成员
SADD tags:article:1 "redis" "database" "cache"
# 查看所有成员
SMEMBERS tags:article:1 # redis, database, cache
# 是否是成员
SISMEMBER tags:article:1 "redis" # 1(true)
# 成员数量
SCARD tags:article:1 # 3
# 移除成员
SREM tags:article:1 "cache"
# 随机弹出
SPOP tags:article:1 # 随机移除并返回一个
SRANDMEMBER tags:article:1 2 # 随机返回2个(不移除)5.2 集合运算
SADD set:a "1" "2" "3" "4"
SADD set:b "3" "4" "5" "6"
# 交集
SINTER set:a set:b # 3, 4
# 并集
SUNION set:a set:b # 1, 2, 3, 4, 5, 6
# 差集(a有但b没有)
SDIFF set:a set:b # 1, 25.3 实战:共同关注
# 用户A关注了
SADD follows:user:A "redis" "mysql" "docker"
# 用户B关注了
SADD follows:user:B "redis" "nginx" "docker"
# 共同关注
SINTER follows:user:A follows:user:B # redis, docker
# A关注但B没关注
SDIFF follows:user:A follows:user:B # mysql
# 推荐关注(B关注但A没关注)
SDIFF follows:user:B follows:user:A # nginx六、ZSet(有序集合)
ZSet 每个成员关联一个分数(score),按分数排序,是 Redis 最强大的数据结构之一。
6.1 基本命令
# 添加成员(带分数)
ZADD ranking 100 "player1"
ZADD ranking 200 "player2"
ZADD ranking 150 "player3"
ZADD ranking 300 "player4"
# 按分数升序排名(0开始)
ZRANGE ranking 0 -1 # player1, player3, player2, player4
ZRANGE ranking 0 -1 WITHSCORES # 带分数
# 按分数降序排名
ZREVRANGE ranking 0 -1 # player4, player2, player3, player1
ZREVRANGE ranking 0 -1 WITHSCORES
# 按分数范围查询
ZRANGEBYSCORE ranking 100 200 # 100~200分之间
ZRANGEBYSCORE ranking "(100" 200 # 不包含100
# 获取成员分数
ZSCORE ranking "player2" # 200
# 获取成员排名
ZRANK ranking "player2" # 2(升序第3名,0开始)
ZREVRANK ranking "player2" # 1(降序第2名)
# 增加分数
ZINCRBY ranking 50 "player1" # player1分数变为150
# 成员数量
ZCARD ranking # 4
# 分数范围内的成员数
ZCOUNT ranking 100 200 # 36.2 实战:游戏排行榜
# 玩家得分
ZADD game_rank 1500 "Alice"
ZADD game_rank 2300 "Bob"
ZADD game_rank 1800 "Charlie"
ZADD game_rank 2100 "David"
ZADD game_rank 1900 "Eve"
# Top 3
ZREVRANGE game_rank 0 2 WITHSCORES
# 1) "Bob" 2) "2300"
# 3) "David" 4) "2100"
# 5) "Eve" 6) "1900"
# 查看某玩家排名
ZREVRANK game_rank "Alice" # 4(第5名)
# 玩家加分
ZINCRBY game_rank 100 "Alice" # Alice: 1600
# 分数段统计
ZCOUNT game_rank 1500 2000 # 3人(Alice, Charlie, Eve)6.3 实战:延迟队列
# 将任务加入延迟队列(score为执行时间戳)
ZADD delay_queue 1721800500 "task1" # 5秒后执行
ZADD delay_queue 1721800600 "task2" # 15秒后执行
ZADD delay_queue 1721800700 "task3" # 25秒后执行
# 消费者轮询:取出已到期的任务
# 用 Lua 脚本保证原子性
# eval "local items = redis.call('ZRANGEBYSCORE', KEYS[1], 0, ARGV[1])
# if #items > 0 then
# redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, ARGV[1])
# end
# return items" 1 delay_queue <当前时间戳>七、其他常用命令
7.1 Key 管理
# 查找key(生产环境慎用 KEYS,用 SCAN)
KEYS user:* # 所有以user:开头的key
SCAN 0 MATCH user:* COUNT 100 # 渐进式扫描
# 过期时间
EXPIRE name 30 # 30秒后过期
EXPIREAT name 1721800000 # 在指定时间戳过期
TTL name # 查看剩余秒数(-1永久,-2已过期)
PERSIST name # 移除过期时间
# 类型判断
TYPE name # string
TYPE user:1001 # hash7.2 通用操作
# 删除
DEL name # 删除单个
DEL name1 name2 # 删除多个
# 判断存在
EXISTS name # 1(存在)
# 重命名
RENAME name newname总结
| 类型 | 核心特点 | 一句话记忆 |
|---|---|---|
| String | 一对一 | 万能缓存 |
| Hash | 一对多 | 对象存储 |
| List | 有序可重复 | 消息队列 |
| Set | 无序不重复 | 去重与运算 |
| ZSet | 有序不重复 | 排行榜 |
掌握这五大类型和核心命令,就能应对 90% 以上的 Redis 使用场景。后续文章将深入持久化、缓存策略和集群部署。
评论 (0)