Redis有序集合

Redis有序集合的编码可以是 ziplist 或者 skiplist

ziplist和skiplist编码选择的标准在于Redis里的元素的数量以及元素成员的长度。
当满足以下2个条件时,元素会选择ziplist编码:
① 有序集合保存的元素数量小于128个
② 有序集合保存的所有元素成员的长度小于64字节

当条件不满足的时候,ziplist可以向skiplist转换。

ziplist:
ziplist编码的有序集合对象使用压缩列表作为底层实现。每个集合使用2个紧挨在一起的压缩列表节点来保存,第一个保存元素的成员,第二个保存元素的分值。压缩列表内的集合按分值从小到大排序,分值较小的元素被放置在靠近表头的位置,分值较大的元素在靠近表尾的位置。

skiplist:
skiplist编码的有序集合对象使用 zset结构作为底层实现,zset结构同时包含一个字典和一个跳跃表。
zset结构的zsl跳跃表按分值从小到大保存了所有集合元素,每个跳跃表都保存了一个集合元素:跳跃表节点的object属性保存了元素的成员,而跳跃表节点的score属性保存了元素的分值。
从了zsl, zset里还保存了一个从成员到分值的映射。

为什么有序集合需要同时使用跳跃表和字典来实现?
跳跃表利于执行范围操作(跳跃表是排好序的),而字典有利于执行分值查找操作。同时由于Redis里的跳跃表和字典元素很多都是用指针实现的,所以不会浪费内存。

压缩列表和跳跃表之间的区别?
压缩列表是Redis为了节约内存而开发的。是由一系列特殊编码的连续内存块组成的顺序型存储结构。当一个列表键只包含少量列表项,并且每个列表项要么是小整数值,要么是长度比较小的字符串,Redis就会用压缩列表作为其底层实现。
跳跃表是一种有序数据结构。它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文为笔者对在学习Redis过程中所收集资料的一个总结,目的是为了以后方便回顾相关的知识,大部分为非原创内容。特此...
    EakonZhao阅读 14,878评论 0 9
  • 参考来源 Redis的内存优化 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直...
    秦汉邮侠阅读 5,077评论 0 2
  • Redis为什么用跳表而不用平衡树? 本文是《Redis内部数据结构详解》系列的第六篇。在本文中,我们围绕一个Re...
    meng_philip123阅读 9,451评论 0 26
  • Redis的内存优化 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。 Redis所有的数据都...
    meng_philip123阅读 18,999评论 2 29
  • 古琴有四种传统的演奏形式,即独奏、琴箫合奏、琴歌伴奏及雅乐合奏。其中,琴箫合奏,是一种极为常见的演奏形式,琴声...
    艺然堂阅读 5,341评论 0 0