Redis的数据类型和底层数据结构是什么?
Redis中的数据类型和数据结构是两个不同的概念:
一、数据类型(对外使用的数据类型)
- 基本数据类型(1)
- String(字符串):最基本的数据类型,可以存储字符串、整数或浮点数,最大512MB
- List(列表):按插入顺序排序的字符串列表,支持双向操作,可用于消息队列
- Hash(哈希):键值对的无序散列表,适合存储对象
- Set(集合):无序的字符串集合,自动去重,支持并交差集运算
- Zset(有序集合):有序的字符串集合,每个元素关联一个分数,可按分数排序
- 特殊数据类型
- Bitmap(位图):二进制位操作,适合统计日活、在线状态等布尔型数据
- HyperLogLog:基数统计,统计UV等,占用空间小,有一定误差
- GEO(地理位置):存储地理坐标,支持计算距离、范围查询等
二、底层数据结构(内部实现)
- 简单动态字符串(SDS)
- 用于实现String类型
- 相比C字符串,增加了长度字段,避免了多次遍历
- 预分配空间,减少内存分配次数
- 双向链表(linkedlist)
- 用于实现List类型
- 带有前驱和后继指针
- 支持双向遍历
- 压缩列表(ziplist)
- 用于优化存储空间
- 可用于实现List、Hash、Zset等
- 适用于元素数量少、元素值小的场景
- 哈希表(hashtable)
- 用于实现Hash、Set等
- 使用MurmurHash2算法计算哈希值
- 采用链地址法解决冲突
- 跳表(skiplist)
- 主要用于实现Zset
- 平均O(logN)的查找复杂度
- 相比红黑树,实现更简单,内存占用更小
- 整数集合(intset)
- 用于优化Set的整数存储
- 随数据升级编码方式
- 节省内存空间
- QuickList
- Redis 3.2后用于实现List
- 结合了ziplist和linkedlist的优点
- 平衡了存储效率和访问效率
三、数据类型与数据结构的关系
- String类型
- 整数:直接存储
- 短字符串(≤44字节):嵌入式存储
- 长字符串:SDS存储
- List类型
- 3.2版本前:ziplist或linkedlist
- 3.2版本后:quicklist
- Hash类型
- 小规模数据:ziplist
- 大规模数据:hashtable
- Set类型
- 整数集合:intset
- 其他情况:hashtable
- Zset类型
- 小规模数据:ziplist
- 大规模数据:skiplist+hashtable
这种分层设计体现了Redis的优化思想:在不同场景下选择最优的数据结构,在性能和内存使用之间取得平衡。