Redis 数据类型与底层结构
Redis 支持哪些数据类型?请介绍它们的特点和适用场景
- String:字符串、整数或二进制内容。适合缓存对象、计数器、分布式锁。
- Hash:字段和值的映射。适合存用户信息、商品信息等对象,可单独修改字段。
- List:有序列表,可从两端插入和弹出。适合简单队列、最新列表。
- Set:无序且唯一。适合标签、去重、共同好友、抽奖。
- Sorted Set:元素唯一,每个元素有 score 并按 score 排序。适合排行榜、延迟队列。
- Bitmap:基于 String 的位操作。适合签到、在线状态、布尔统计。
- HyperLogLog:近似基数统计。适合 UV、独立 IP,优点是占用很小,缺点是有误差。
- Geospatial:经纬度位置能力。适合附近的人、门店距离计算。
- Stream:日志型消息结构,支持消费者组。适合可靠性比 List 更高的消息队列场景。
面试回答时要把“结构特点”和“业务场景”绑定,不要只背类型名称。
Redis 常见 5 种数据结构的底层实现
- String:底层是 SDS,记录长度和容量,二进制安全,扩容比 C 字符串更友好。
- List:Redis 3.2 之后主要使用 quicklist,它把多个紧凑节点串成双向链表;Redis 7 中紧凑编码更多使用 listpack。
- Hash:元素较少且字段和值较小时用 listpack,数据变多后转成 hashtable。
- Set:全是整数且数量较少时用 intset,否则用 hashtable。
- ZSet:元素较少时用 listpack,数据变多后用 skiplist + dict。dict 用于 O(1) 查成员,skiplist 用于范围和排序。
底层结构会根据元素数量和元素大小自动转换,不能只记老版本的 ziplist。现在面试里可以补一句:Redis 新版本里 ziplist 已逐步被 listpack 替代。