Redis的数据类型和底层数据结构是什么?

Redis中的数据类型和数据结构是两个不同的概念:

一、数据类型(对外使用的数据类型)

  1. 基本数据类型(1)
  • String(字符串):最基本的数据类型,可以存储字符串、整数或浮点数,最大512MB
  • List(列表):按插入顺序排序的字符串列表,支持双向操作,可用于消息队列
  • Hash(哈希):键值对的无序散列表,适合存储对象
  • Set(集合):无序的字符串集合,自动去重,支持并交差集运算
  • Zset(有序集合):有序的字符串集合,每个元素关联一个分数,可按分数排序
  1. 特殊数据类型
  • Bitmap(位图):二进制位操作,适合统计日活、在线状态等布尔型数据
  • HyperLogLog:基数统计,统计UV等,占用空间小,有一定误差
  • GEO(地理位置):存储地理坐标,支持计算距离、范围查询等

二、底层数据结构(内部实现)

  1. 简单动态字符串(SDS)
  • 用于实现String类型
  • 相比C字符串,增加了长度字段,避免了多次遍历
  • 预分配空间,减少内存分配次数
  1. 双向链表(linkedlist)
  • 用于实现List类型
  • 带有前驱和后继指针
  • 支持双向遍历
  1. 压缩列表(ziplist)
  • 用于优化存储空间
  • 可用于实现List、Hash、Zset等
  • 适用于元素数量少、元素值小的场景
  1. 哈希表(hashtable)
  • 用于实现Hash、Set等
  • 使用MurmurHash2算法计算哈希值
  • 采用链地址法解决冲突
  1. 跳表(skiplist)
  • 主要用于实现Zset
  • 平均O(logN)的查找复杂度
  • 相比红黑树,实现更简单,内存占用更小
  1. 整数集合(intset)
  • 用于优化Set的整数存储
  • 随数据升级编码方式
  • 节省内存空间
  1. QuickList
  • Redis 3.2后用于实现List
  • 结合了ziplist和linkedlist的优点
  • 平衡了存储效率和访问效率

三、数据类型与数据结构的关系

  1. String类型
  • 整数:直接存储
  • 短字符串(≤44字节):嵌入式存储
  • 长字符串:SDS存储
  1. List类型
  • 3.2版本前:ziplist或linkedlist
  • 3.2版本后:quicklist
  1. Hash类型
  • 小规模数据:ziplist
  • 大规模数据:hashtable
  1. Set类型
  • 整数集合:intset
  • 其他情况:hashtable
  1. Zset类型
  • 小规模数据:ziplist
  • 大规模数据:skiplist+hashtable

这种分层设计体现了Redis的优化思想:在不同场景下选择最优的数据结构,在性能和内存使用之间取得平衡。