Redis 五种常见数据类型(工程师速查版)
核心概念:Redis 是内存键值数据库,Key 永远是 String,Value 可以是五种数据结构之一。
0. 五大数据类型速览
| 类型 | 类比 | 特点 | 典型场景 | |
|---|---|---|---|---|
| String | 变量 | 存一个值 | 缓存、计数、Token、验证码 | |
| Hash | 对象 / 一行数据 | 字段-值对 | 用户信息、配置、商品详情 | |
| List | 队列 | 有序、可重复 | 消息队列、最新动态 | |
| Set | 集合 | 无序、不重复 | 标签、好友关系、去重 | |
| ZSet | 带权重的集合 | 有序、不重复 | 排行榜、优先级队列 |
1. String(字符串)—— 存「一个值」
值可以是:数字 / 字符串 / JSON / 二进制
基本读写
SET key value # 设置 key 的值为 value(key 已存在则覆盖)
GET key # 获取 key 的值
DEL key # 删除 key
EXISTS key # 判断 key 是否存在(1=存在,0=不存在)
过期时间(非常重要)
SET key value EX 60 # 设置 key=value,60 秒后自动删除
TTL key # 查看 key 剩余过期秒数
# -1 = 没有设置过期时间
# -2 = key 不存在
EXPIRE key 60 # 为已有 key 设置 60 秒过期
PERSIST key # 移除 key 的过期时间(变永久)
常用场景:验证码、登录 Token、临时状态
计数操作(Redis 强项,原子操作)
INCR key # key 对应数字 +1
DECR key # key 对应数字 -1
INCRBY key 10 # key 对应数字 +10
常用场景:访问量统计、未读消息数、库存扣减
条件设置
SET key value NX # 仅当 key 不存在时才设置(常用于分布式锁)
SET key value XX # 仅当 key 已存在时才设置(更新)
2. Hash(哈希)—— 存「一个对象」
类比:C# 的
Dictionary<string, string>,MySQL 的一行数据
设置字段
HSET user:1 name "Tom" # 在 user:1 对象中设置 name = Tom
HSET user:1 age 18 # 同一个对象可不断加字段
读取字段
HGET user:1 name # 获取 user:1 的 name 字段
HGETALL user:1 # 获取 user:1 所有字段和值
删除 & 判断
HDEL user:1 age # 删除 age 字段(不是删整个 key)
HEXISTS user:1 name # 判断对象里是否有 name 字段(1=存在)
HLEN user:1 # 获取 user:1 的字段数量
推荐场景:用户信息、医生资料、群组配置、商品详情
3. List(列表)—— 有序的队列
有序、可重复,从两端进出
插入(推入)
LPUSH messages "msg1" # 从左边(头部)插入
RPUSH messages "msg2" # 从右边(尾部)插入
弹出(取出并删除)
LPOP messages # 从左边弹出
RPOP messages # 从右边弹出
LPUSH + RPOP 组合 = 队列(FIFO)
LPUSH + LPOP 组合 = 栈(LIFO)
查看 & 长度
LRANGE messages 0 -1 # 查看整个列表(0=第一个,-1=最后一个)
LLEN messages # 列表长度
常用场景:消息队列、最新 N 条动态、操作日志
4. Set(集合)—— 「在不在里面」
无序、不重复,只关心成员是否存在
增删查
SADD online_users user1 # 添加成员
SREM online_users user1 # 删除成员
SMEMBERS online_users # 查看所有成员
SCARD online_users # 成员数量
SISMEMBER online_users user1 # 判断 user1 是否在集合中(1=是,0=否)
集合运算
SUNION set1 set2 # 并集(两个集合中所有成员)
SINTER set1 set2 # 交集(两个集合共有的)
SDIFF set1 set2 # 差集(在 set1 但不在 set2)
常用场景:在线用户、标签系统、共同好友、去重
5. ZSet(有序集合)—— 排行榜专用
每个成员带一个分数(score),按分数排序,成员不可重复
增删查
ZADD rank 100 tom # 添加成员 tom,分数 100
ZADD rank 200 jack # 添加成员 jack,分数 200
ZREM rank tom # 删除成员
查询排名
ZRANGE rank 0 -1 WITHSCORES # 按分数从小到大列出所有成员及分数
ZREVRANGE rank 0 -1 WITHSCORES # 按分数从大到小(即排行榜)
ZSCORE rank tom # 查看 tom 的分数
ZRANK rank tom # 查看 tom 的排名(从小到大,0 起始)
ZREVRANK rank tom # 查看 tom 的排名(从大到小)
常用场景:排行榜、积分排名、优先级队列、延迟队列
6. Key 通用命令
这些命令适用于所有数据类型的 Key。
KEYS pattern # 查找匹配的 key(如 KEYS user:*)
# ⚠️ 线上慎用,数据量大时会阻塞
SCAN 0 MATCH user:* COUNT 100 # 增量扫描 key(推荐,非阻塞)
TYPE key # 查看 key 的类型(string/hash/list/set/zset)
DEL key # 删除 key(适用于所有类型)
EXISTS key # 判断 key 是否存在
EXPIRE key 60 # 设置过期时间(秒)
TTL key # 查看剩余过期时间
7. 高级特性
发布/订阅
SUBSCRIBE chat # 订阅频道 chat
PUBLISH chat "hello" # 向频道 chat 发送消息
事务
MULTI # 开始事务
INCR count
EXPIRE count 60
EXEC # 提交事务(一次性执行队列中的所有命令)
分布式锁
# 加锁:仅当 lock:key 不存在时设置,10 秒自动释放
SET lock:key value NX EX 10
# 释放锁
DEL lock:key
注意:生产环境建议使用 Redlock 算法或 Redisson 客户端,简单 SET NX 在故障恢复场景下有安全性问题。
8. 类型对比速查
| 操作 | String | Hash | List | Set | ZSet |
|---|---|---|---|---|---|
| 添加 | SET |
HSET |
LPUSH/RPUSH |
SADD |
ZADD |
| 读取 | GET |
HGET / HGETALL |
LRANGE |
SMEMBERS |
ZRANGE |
| 删除 | DEL |
HDEL |
LPOP/RPOP |
SREM |
ZREM |
| 判断存在 | EXISTS |
HEXISTS |
— | SISMEMBER |
ZSCORE |
| 计数/长度 | INCR |
HLEN |
LLEN |
SCARD |
ZCARD |
| 排序 | — | — | 按插入顺序 | — | 按分数 |
学习建议:先从 String 和 Hash 开始,每天敲两遍命令加深记忆。理解「什么时候用哪种类型」比背命令更重要。
