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命令的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。