redis列表(redis命令)

本篇文章给大家谈谈redis列表,以及redis命令对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Redis数据结构--List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到皮空列表的头部(左边)或者尾部(右边)

一个列表最多可以包含超过 40亿个元素

列表的常用命令(持续扩充):

1、lpush key value1 [value2]: 将一个或多个值插入列表头部(左边)

通过执行lpush animal cat dog   向animal中左边同时插入 cat和dog,下方提示的(Integer)2,是指当前列表中元素的个数;

然后通过查询命令,我们可以看到排在第一个的是dog 第二个是cat,这是因为从左边插入,县插入cat,然后再在左侧插入dog,这就导致dog在cat的前面。

2、rpush key value1 [value2]: 将一个或多个值插入列表尾部(右边)

执行rpush animal monkey:向列表的右侧插入一个元素monkey,此时列表中的元素就有3个

通过查询命令我们可以看到monkey出现在了列表的尾部

3、lrange key start stop: 获取列表指定范围内的元素(包含start和stop)

执行lrange animal 1 2  查询物银列表的第2个和第3个元素(注意列表中的索引是从0开始计算的)

4、llen key: 获取列表长度

在前面几个步骤中我们一共插入了三个元素dog、cat、monkey

5、lpop key: 移出并获取列表的第一个元素

列表中第一个元素是dog,执行lpop animal后,弹出左边第一个元素并燃蚂瞎返回,再次查询,我们看到只剩下两个元素

6、rpop key: 移出并获取列表的最后一个元素

执行rpop animal,移除并返回monkey,最后列表中只剩下cat一个元素

[img]

【Redis】基础数据结构-ziplist压缩列表

压缩列表是列表和哈希表的底层实现之一:

Redis压缩列表是由连续的内存块组成的列表,主要包含以下内容:

列表在初始化的时候会计算需要分配的内存空间大小,然后进行内存分配,之后将内存空间的最后一个字节标记为列表结尾,内存空间的大小计算方式如下:

所以在创建之后,内存布局如下,此时压缩列表中还没有节点:

之后如果如果需要添加节点,会进行移动,为新节点的插入腾出空间,所以还是斗弯余占用的连续的空间:

压缩列表的节点可以存储字符串或者整数类型的值,为了节省内存,它采用了变长的编码方式,压缩列表的节点的结构定义如下:

prevrawlen :存储前一个节点的长度(占用的字节数),这样如果从后向前遍历,只需要当前节点的起始地址减去长度的偏移量prevrawlen就可以定位到上一个节点的位置,prevrawlen的长度可以是1字节或者5字节:

encoding :记录了节点的数据类型和内容的长度,因为压缩列表可以存储字符串或者整型,所以有以下两种情况:

存储内容为整数时,encoding占用1个字节,最高位是11开头,后六位代表整数值的长度,其中当编码为1111xxxx时情况比较特殊,

后四位的值在0001和1101之间, 此时直接代表数据的内容,是0到12之间的一个数字 ,并不是数据长度,因为它代表了数据内容,所以也不需要额外的空间存储数据内容。

zipStoreEntryEncoding

因为压缩列表中每个节点记录了前一个节点的长度:

假设有一种情况,一个压缩列表中,存储了多个长度是253字节的节点,因为节点的长度都在254字节以内,所以每个节点的prevrawlen只需要1个字节去存储长度的值:

此时在列表的头部需要新增加一个节点,并且节点的长度大于254,这个时候原先的头结点entry1 prevrawlen使用1字节已经不能满足当前的情况了,必须要使用5字节存储,因此entry1的prevrawlen变成了5字节,entry1的长度也会跟着增加4个字节,已经超过了254字节,因为大于254就需要使用5个字节存储,所以entry2的prevrawlen也闹李需要改变为5字节,后面的以此类推,引发了连锁更新,这种情况称之为连锁更新:

总结空滚

(1)Redis压缩列表使用了一块连续的内存,来节约内存空间。

(2)压缩列表的节点可以存储字符串或者整数类型的值,它采用了变长的编码方式,根据数据类型的不同以及数据长度的不同,选择不同的编码方式,每种编码占用的字节大小不同,以此来节约内存。

(3)压缩列表的每个节点中存储了前一个节点的字节长度,如果知道某个节点的地址,可以使用地址减去字节长度定位到上一个节点,不过新增节点的时候,由于前一个节点的长度大于254使用5个字节,小于254使用1个字节存储,在一些极端的情况下由于长度的变化会引起连锁更新。

参考

黄健宏《Redis设计与实现》

极客时间 - Redis源码剖析与实战(蒋德钧)

【张铁蕾】Redis内部数据结构详解(4)——ziplist

【_HelloBug】Redis-压缩表-__ziplistInsert详解

图解Redis之数据结构篇——压缩列表

Redis版本:redis-6.2.5

redis某个key是个列表

如果 Redis 中某个 key 对应的值是一个列表(list),您可以使用以下命令对其进行操作:

1. LPUSH/ RPUSH: 向列表左侧或右侧添加元素。

命令格式:

LPUSH key value1 [value2 ... valuen]

RPUSH key value1 [value2 ... valuen]

如:LPUSH mylist "redis" "mongodb" "mysql"

2. LPOP/RPOP: 从列表左侧或右侧弹出元素,相当于删除列表头部或尾部的元素,并返回该元素的值。

命令格式数中:

LPOP key

RPOP key

如:LPOP mylist

3. LINDEX: 获取列表中指定索引位置的元素。

命薯庆山令格式:

LINDEX key index

如:LINDEX mylist 0

4. LRANGE: 获取列表中指定范围内的所有元素。

命令格式:

LRANGE key start stop

如:LRANGE mylist 0 2

5. LLEN: 获取列表的长度(即其中元素的个数)。

命令格式:

LLEN key

如:LLEN mylist

6. LREM: 从列表中删除指定数量的元素。可以差岩通过给定的 count 参数来控制删除相同元素的个数。

命令格式:

LREM key count value

如:LREM mylist 2 "redis"

希望这些命令能够帮助您操作 Redis 中的列表。

关于redis列表和redis命令的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表