Redis 数据结构和算法
String
字符串,应用于普通的缓存场景,例如计数、共享 Session 、分布式锁等场景
数据结构:
- int:8 个字节的长整型
- embstr:小于等于 39 个字节的字符串
- raw:大于 39 个字节的字符串
Hash
哈希类型,应用于存储对象、序列化等场景
数据结构:
- ziplist:压缩列表,当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以再节省内存方面比 hashtable 更加优秀。
- hashtable:哈希表,当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度是 O(1)。
List
列表,应用于消息队列、分页等场景,该数据结构很灵活,有很多实现,例如:
- lpush + lpop = Stack (栈)
- lpush + rpop = Queue (队列)
- lpush + ltrim = Capped Collection (有限集合)
- lpush + brpop = Message Queue (消息队列)
数据结构:
Redis 3.0 之前
- ziplist:压缩列表,当列表的元素个数小于 list-max-ziplist-entries 配置(默认512个),同时列表中每个元素的值小于 list-max-ziplist-value 配置时(默认64字节),Redis 会选用 ziplist 来作为列表的内部实现来减少内存的使用。
- linkedlist:链表,当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。
Redis 3.0 之后
- quicklist:quicklist 是 ziplist 和 linkedlist 的混合体,它将 linkedlist 按段切分,每一段使用 ziplist 紧凑存储,多个 ziplist 之间使用双向指针串接起来。
Set
集合也是用来保存多个字符串元素,但和列表不同之处是,集合中不允许有重复元素,并且集合元素是无序的,不能通过索引下表获取元素。应用于用户标签、抽奖等场景。
数据结构:
- intset:整数集合,当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认512)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。
- hashtable:当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。
ZSet
有序集合保留了集合不能有重复成员的特性,但是有序集合中的元素可以排序。和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。可以实现集合间的操作,例如交集、并集等。应用于排行榜、用户赞等功能。
数据结构:
- ziplist:压缩列表,当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认128个),同时每个元素的值都小于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会用 ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。
- skiplist:跳跃表,当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时 ziplist 的读写效率会下降。
本文由 Meridian 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 27,2020