reids的数据结构的应用场景
String 字符串
- 特点:二进制安全,最简单结构
- 业务场景:分布式锁(SET NX EX)、验证码、token、计数器、简单 JSON 缓存
- 注意:分布式锁 value 存唯一 UUID,释放锁要用 Lua 脚本,不能直接 DEL
Hash(key‑field‑value)
- 特点:类似 map,支持局部更新单个字段,不用全量重写
- 业务场景:用户基础信息、购物车、商品基础信息
- 注意:只适合扁平对象,不支持嵌套对象;嵌套复杂对象用 String (JSON) / RedisJSON
List 双向链表
- 特点:有序、允许重复;两端读写快,中间索引查询慢
- 业务场景:简易消息队列、消息列表、班级对应一批学生名称
- 注意:不要拿 List 做大量中间位置查询
Set 集合(无序,元素不重复)
- 特点:自动去重;支持交集 SINTER、并集 SUNION、差集 SDIFF
- 业务场景:帖子点赞防重复、共同好友计算、标签、小数据 UV 去重
- 坑:只能给整个 key 设置过期,集合内部单个元素不能单独过期;无序,不能做排序;不适合分布式锁
ZSet 有序集合 member+score
- 特点:元素唯一,依靠 score 排序;score 仅用来排序
- 业务场景:排行榜、点赞热度排序、延时队列、带过期的去重(score 存时间戳)
- 坑:score 是 double 类型,存在精度丢失;不要把完整业务数据存入 score
Bitmap(底层是 String,命令操作 bit 位)
- 业务场景:用户签到,偏移量代表日期,0 未签到,1 已签到
- 特点:内存占用极低;offset 下标从 0 开始
HyperLogLog(底层是 String,概率统计)
- 业务场景:海量 UV 独立访客统计
- 特点:内存固定约 12KB;允许 0.81% 误差;⚠️拿不到原始元素,只能得到估算总数
- 命令:PFADD 添加、PFCOUNT 统计、PFMERGE 合并
RedisJSON(Redis8 原生 / RedisStack 模块)
- 特点:服务端识别 JSON 树形结构,支持 JSONPath 局部读写嵌套字段、数组
- 对比:
- String 存 JSON 字符串:全读全改
- Hash:只能扁平一层
- RedisJSON:支持多层嵌套局部更新