Redis 有哪些类型
在 Redis 中有五种数据类型
- String:字符串
- Hash:字典
- List:列表
- Set:集合
- Sorted Set:有序集合
背出这五种只算及格。真正决定使用效果的是两个更深的问题:每种类型底层用什么编码实现(决定内存与性能),以及什么业务场景该选哪种类型(决定设计质量)。本文按”类型 → 底层编码 → 典型场景”三层展开。
String:不只是字符串
String 是最基础的类型,值可以是字符串、整数或浮点数,底层编码有三种:
int:值是能 long 表示的整数,直接存数值,可做原子自增embstr:短字符串(≤44 字节),对象头与数据一次分配,读快但修改会转 rawraw:长字符串,SDS 实现,O(1) 取长度、二进制安全
典型场景:缓存对象(序列化后整存)、计数器(INCR 原子性天然适合点赞数/限流)、分布式锁(SET key val NX PX)。注意整存整取意味着局部字段更新要全量重写,字段多时优先考虑 Hash。
Hash:对象的结构化存储
Hash 是 field-value 字典,底层编码:
ziplist(listpack):字段少且值小时用紧凑连续内存,省内存但修改可能触发重排hashtable:字段多或值大时退化为此
典型场景:存用户对象(HSET user:1 name age),可单字段更新;也用于购物车(field=商品 id,value=数量)。ziplist 阈值由 hash-max-ziplist-entries 等配置控制,超出自动转 hashtable。
List:双端链表语义
List 支持两端推入弹出,底层是 quicklist(ziplist 组成的双向链表),兼顾内存紧凑与两端操作 O(1)。
典型场景:消息队列(LPUSH+BRPOP,阻塞弹出避免轮询)、时间线(LPUSH+LTRIM 保留最新 N 条)。注意 List 按位置访问中间元素是 O(N),不适合随机读。
Set:去重与集合运算
Set 是无序去重集合,底层 intset(全整数且量小)或 hashtable。
典型场景:抽奖/点赞成员(去重)、共同好友(SINTER 交集)、标签系统。集合运算在服务端完成,比拉回客户端计算高效得多。
Sorted Set:带分数的排行榜
Zset 每个成员带一个 double 分数,底层 ziplist 或 skiplist + hashtable:跳表支持范围查询 O(logN),哈希表反查成员分数 O(1)。
典型场景:排行榜(ZINCRBY+ZREVRANGE)、延迟队列(score=执行时间戳,轮询 ZRANGEBYSCORE)、滑动窗口限流(score=请求时间戳)。
三种扩展类型
- Bitmap:按位操作,适合亿级用户签到/活跃统计(1 亿用户日活仅 12MB)
- HyperLogLog:基数统计,12KB 固定内存估 UV,误差约 0.81%
- Geo:经纬度半径查询(附近的人),底层就是 Zset
选型速查
- 整存整取、计数、锁 → String
- 对象局部字段更新 → Hash
- 队列、时间线 → List
- 去重、交并差 → Set
- 排序、范围、延迟 → Zset
- 位图统计、UV、地理位置 → Bitmap / HyperLogLog / Geo
类型选对的收益远大于调优参数:用 Zset 做延迟队列、用 Bitmap 做签到,都是”数据结构即方案”的体现。反过来,把 Hash 当 String 序列化存、用 List 模拟集合去重,都会在数据量上来后付出内存与复杂度的双重代价。











