当前位置:首页 > 缓存 > 正文内容

redis中zset有序集合的底层实现

phpmianshi4年前 (2017-05-19)缓存206

跳跃表

Zset 是一个有序的链表结构,其底层的数据结构是跳跃表 skiplist,其结构如下:

typedef struct zskiplistNode {
    //成员对象
   robj *obj;
    //分值
    //后退指针
   struct zskiplistNode *backward;
    //层
   struct zskiplistLevel {
        struct zskiplistNode *forward;//前进指针
        unsigned int span;//跨度
   } level[];
 } zskiplistNode;
 
typedef struct zskiplist {
    //表头节点和表尾节点
   struct zskiplistNode *header, *tail;
    //表中节点的的数量
   unsigned long length;
    //表中层数最大的节点层数
   int level;
 } zskiplist;

图片.png

前进指针

    用于从表头向表尾方向遍历。

后退指针

    用于从表尾向表头方向回退一个节点,和前进指针不同的是,前进指针可以一次性跳跃多个节点,后退指针每次只能后退到上一个节点。

跨度

    表示当前节点和下一个节点的距离,跨度越大,两个节点中间相隔的元素越多。

在查询过程中跳跃着前进。由于存在后退指针,如果查询时超出了范围,通过后退指针回退到上一个节点后仍可以继续向前遍历。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

redis中过期数据的删除以及对性能的影响

过期数据的删除对Redis性能影响当我们对某些 key 设置了 expire 时,数据到了时间会自动删除。如果一个键过期了,它会在什么时候删除呢?下面介绍三种删...

memcached中telnet连接命令使用详解

连接 memcachedtelnet连接memcached,输入命令telnet 127.0.0.1 11211查看是否正常查看一下memcache是否正常,输入命令 statss...

redis中单线程为什么这么快

一. Redis性能如此高的原因1. 纯内存操作,内存的读写速度非常快2. 单线程,保证了每个操作的原子性,省去了很多上下文切换线程的时间3. 高效的数据结构,如压缩表,对短数据进行压缩存储,再如,跳...

Redis和memache缓存的区别

1.数据类型Redis数据类型丰富,支持set list hash等类型memcache支持简单数据类型,需要客户端自己处理复杂对象2.持久性redis支持数据落地持久化存储,并不是所有的数据都一直存...

redis的热key问题如何解决

概念其实热key问题说来也很简单,就是瞬间有几十万的请求去访问redis上某个固定的key,那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机。那接下来这个key的请求...

redis的bigkey问题如何解决

寻找big key有如下几种方法redis-cli自带--bigkeys,例如:redis-cli -h -a --bigkeys获取生产Redis的rdb文件,通过rdbtools分析rdb生成cs...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。