首页 > 编程知识 正文

redis list命令,redis ziplist

时间:2023-05-04 01:41:02 阅读:128969 作者:4608

ziplist压缩表ziplist主要为了节省内存,将元素存储在连续的内存空间中,以便在查询数据时也可以利用CPU缓存访问数据,从而提高查询效率

与数组相比。 我们知道数组中每个元素的大小必须相同。 如果要存储不同长度的字符串,则必须使用最大长度的字符串大小作为元素的大小(5字节)。 小于5字节的字符串也会打开5字节,浪费了一些存储空间。

ziplist根据每个节点的长度确定占用的内存大小,从而在每次添加元素时计算下一个节点在内存中的存储位置并创建压缩列表。

在redis中使用ziplist

//列表struct ziplistT { int32 zlbytes; //压缩列表消耗的内存字节数int32 zltail_offset; //用于记录末尾节点距离起始地址多少字节,并快速找到最后一个元素int16 zllength; //压缩列表中包含的节点数T[] entries; //压缩列表中包含的所有节点int8 zlend; //特殊值0xFF,标记压缩列表末尾} ziplist;

配置zlentry节点

//列表节点struct entry { intval prevlen; //上一个条目节点的长度。 易于反向搜索intval encoding存储在节点内容属性中的数据类型optional byte[] content; //节点值} entry;

content的字节大小允许您定位以下节点,从而便于遍历ziplist链表

skiplist跳表

跳转列表(skip list )的目标是平衡树(AVL Tree )、红黑树,插入/删除/检索都是o ) O(log n )的数据结构。 这两个查询的效率几乎相同

跳汰机的最大优点是原理简单、容易实现、效率高。 同时性的情况下,红黑树在插入删除时可能需要进行数量平衡的操作。 也就是说,以树的左旋和右旋保持树的平衡会影响其他子树的节点,但跳表只局部影响,不影响其他节点skiplist在空间中改变时间

跳转表一般处理双向链表。 最低的是原始数据的双向链表。 根据score得分从小到大排序。 每个其他节点都有层数level[],每个层都有索引节点,主要用于加速数据查询

作为skiplist基础的数据结构

typedef struct zskiplist { //头部节点、末端节点struct zskiplistNode *header、*tail; //节点数unsigned long length; //当前表中节点的最大层数int level; } zskiplist; typedefstructzskiplistnode {//member对象robj *obj; //得分,低位为原始数据,双向链表按score从小到大的顺序排序的双精度score; //返回指针struct zskiplistNode *backward; //层,节点创建基于随机算法计算层数。 lecel数组大小structzskiplistlevel(//下一个节点struct zskiplistNode *forward; //此层跨越的节点数,同一层中从当前节点到下一个节点的距离不统一间距; } level[]; } zskiplistNode;

如果没有级别(即索引),则在查询链表时会从头到尾遍历链表,从而导致查询变慢

因此,要跳表,必须添加层次结构、添加索引和提高查询效率

跳转表是牺牲空间来换取时间的,除了最底层是最原始的数据之外,所有其他层次实际上相当于索引(单向链表)。

搜索数据后,从顶层开始从级别3搜索,例如第117、第3和第21117号,然后导航到级别2 37节点继续搜索,直到找到搜索到的元素。 (

这样可以一次跳过多个节点

检索数据19、查询执行图

将元素插入到跳转表中时,会为一个节点建立索引或索引,并通过随机算法在插入节点时进行计算。 也就是说,层数level[]是随机的,最终在底层的原始数据(双向链表)中插入元素,随机计算层数,然后为每一层添加索引节点

19追加的节点层数level按照随机算法计算

新添加的节点119,他的正向前进指针指向当前层的最右边节点,span计算当前层的当前节点与最右边节点之间的距离,而119节点的最左边节点85和层节点71的前锋和span重新计算。

记住,需要了解跳转表的好处,主要提高搜索效率,使查询接近二分查找。

例如,面试官会问你问题。 为什么redis这么快,不是在动脑子,

1 )可以从数据结构中与面试者分析为什么redis的五种基本数据类型,查询性能如此高。

2,关于IO复用的结构,请参阅后面的文章。

从原理上分析,redis为什么这么快,redis6.0加入多线程,主要在网络IO上

如果能输出redis的IO机型的话,你就好了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。