Skip to content

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 替代。