直接回答
五大基础类型:String(缓存对象、计数器、分布式锁)、Hash(对象字段级存取,如用户信息)、List(消息队列、最新列表)、Set(去重、交集并集,如共同关注)、ZSet(排行榜、延迟队列)。此外还有 Bitmap、HyperLogLog、Geo、Stream 等扩展类型。
展开解析
底层实现(Redis 3.2 之后的主要编码):
- String:SDS(简单动态字符串),带长度和预分配,O(1) 取长度,二进制安全。
- Hash:小数据用 ziplist/listpack,元素多后转 hashtable。
- List:3.2 起统一为 quicklist(链表 + 每个节点是 listpack,兼顾内存与访问效率)。
- Set:整数且少时用 intset,否则 hashtable。
- ZSet:元素少用 listpack,否则 hashtable + skiplist(跳表),跳表支撑 O(log N) 的范围查询。
场景选型举例:计数用 String 的 INCR;session/对象缓存用 Hash 可单独更新字段省序列化成本;点赞/共同好友用 Set 的 SINTER;排行榜用 ZSet 的 ZRANGE/ZREVRANK;UV 粗略统计用 HyperLogLog(约 0.81% 误差,内存极小)。
追问方向:ziplist 为什么被 listpack 替代(连锁更新问题)、每种编码的转换阈值(由 hash-max-listpack-entries 等配置控制)。