Redis数据结构之list对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis数据结构之list对象相关的知识,希望对你有一定的参考价值。

参考技术A 新版本的redis的list对象都是使用quicklit编码。为了更好的理解quicklit编码,我们先介绍quicklit编码的前身,ziplist和linklist。

==ziplist和linklist都已经被quicklit所取代,这里只是为了更好的理解quicklit才列出ziplist和linklist两种编码==

顾名思义,压缩链表,为了节约内存空间而设计。

·若列表zlbytes属性的值为0x50(十进制80),表示压缩列表的总长为80字节。
·若列表zltail属性的值为0x3c(十进制60),这表示如果我们有一个指向压缩列表起始地址的指针p,那么只要用指针p加上偏移量60,就可以计算出表尾节点entry3的地址。
·若列表zllen属性的值为0x3(十进制3),表示压缩列表包含三个节点。

节点的previous_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度,也就是说当我们获取到一个指向当前节点的指针p时,么只要用指针p减去偏移量previous_entry_length就可以获得上一个节点,通过zltail属性又可快速获取最后一个节点。压缩链表通过这种方式实现从表尾向表头遍历链表。
压缩链表开辟了一块连续的空间实现了链表结构,极大的提高的内存的利用率,缺点是需要经常要重新分配内存。

优点是插入新增不需要重新分配内寸,缺点内存使用效率较低。

了解了ziplist和linkedlist之后就很容易理解quicklist的结构了

这样就极大的降低了内存的碎片化程度,又降低了内存重新分配的规模。

实际使用的时候,quicklist在不断的新增元素时,第一个quicklistNode和最后一个quicklistNode指向的ziplist始终保持不压缩的状态,而中间的ziplist会被再次压缩(执行LZF算法)。不被压缩的ziplist数量是由redis.conf中的list-compress-depth决定的,默认是一,也就是第一个和最后一个不被压缩,当ziplist满了需要新建一个quicklistNode时它的空间限制是8kb,由list-max-ziplist-size决定。

我们可以用rpush,lpush,rpop,lpop等命令操作quicklist。

Redis 基础 -- Redis数据类型之list

1. Redis数据类型之list


1.1 list类型介绍



1.2 list 类型数据基本操作

  • 如果你想按照push的顺序获取数据,那么你需要从push相反的方向去获取数据。

  • 索引这里,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推。

示例:


1.3 list 类型数据扩展操作:规定时间内获取并移除数据

b表示阻塞的意思:block

  • Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • Redis Brpoplpush 命令从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

示例:



1.4 list 类型数据扩展操作:微信朋友圈点赞

业务场景:

解决方案:


示例:


1.5 list 类型数据操作注意事项


1.6 list 应用场景:list实现日志消息队列





以上是关于Redis数据结构之list对象的主要内容,如果未能解决你的问题,请参考以下文章

Redis 基础 -- Redis数据类型之list

《闲扯Redis三》Redis五种数据类型之List型

Redis数据结构之string类型和list类型

redis数据类型之list

redis数据类型之list

redis数据类型之—List