redis的list数据类型相关命令分析及如何使用
list是一个按照插入顺序排序的字符串数组(说通俗点,仍然存储字符串)。你可以添加一个元素到列表的头部(左边)或者尾部(右边),个列表最多可以包含^32-1个元素(每个列表超过40亿个元素)。
Redis中的list和Java中的LinkedList很像,底层都是一种链表结构,list的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。尽管表面上仍然是列表,但Redis中的列表底层实现并不仅限于简单的双向链表。
当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表),它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表)结构。
可单纯的链表也是有缺陷的,链表的前后指针prev和next会占用较多的内存,会比较浪费空间,而且会加重内存的碎片化。自Redis 3.2之后,Redis使用混合数据结构quicklist(快速链表),该结构由ziplist和链表组成。
lpush key value
从左边插入元素(将一个或多个值插入到列表头部)
127.0.0.1:6379>lpush ids 1
(integer) 1
127.0.0.1:6379>
lrange ids 0 -1
1) "
1"
127.0.0.1:6379>
lpush ids 2
(integer) 2
127.0.0.1:6379>
lrange ids 0 -1
1) "
2"
2) "
1"
rpush key value
从右边插入元素(将一个或多个值插入到列表的尾部(最右边))
127.0.0.1:6379>rpush ids 3
(integer) 3
127.0.0.1:6379>
lrange ids 0 -1
1) "
2"
2) "
1"
3) "
3"
linsert key BEFORE|AFTER pivot value向某个元素前/后插入元素,返回结果为当前列表长度,注意列表不存在或者指定元素不存在列表中时,都将不执行任何操作。
//元素3前插入0127.0.0.1:6379>
linsert ids before 3 0
(integer) 4
127.0.0.1:6379>
lrange ids 0 -1
1) "
2"
2) "
1"
3) "
0"
4) "
3"
//元素3后插入0
127.0.0.1:6379>
linsert ids after 3 4
(integer) 5
127.0.0.1:6379>
lrange ids 0 -1
1) "
2"
2) "
1"
3) "
0"
4) "
3"
5) "
4"
查询命令
lrange key start end获取列表中指定范围内的元素列表;若start值大于列表end值则返回空列表如上已经展示过了
lindex key index获取列表指定索引下标的元素
127.0.0.1:6379>lindex ids 0
"
2"
127.0.0.1:6379>
lindex ids -1
"
4"
llen key获取列表长度;列表不存在则返回0
127.0.0.1:6379>llen ids
(integer) 5 弹出/删除命令
lpop key从列表左侧弹出元素并返回头部元素
127.0.0.1:6379>lpop ids
"
2"
127.0.0.1:6379>
lrange ids 0 -1
1) "
1"
2) "
0"
3) "
3"
4) "
4"
rpop key从列表右侧弹出元素并返回尾部元素
127.0.0.1:6379>rpop ids
"
4"
127.0.0.1:6379>
lrange ids 0 -1
1) "
1"
2) "
0"
3) "
3"
lrem key count value从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:count >
0,从表头开始向表尾,移除数量为count个元素;count <
0,从表尾开始向表头,移除数量为count的绝对值个元素;count = 0,移除表中所有与 value 相等的值
lrem ids 0 3
(integer) 1
127.0.0.1:6379>
lrange ids 0 -1
1) "
1"
2) "
0"
ltrim key start end对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
127.0.0.1:6379>ltrim ids 0 0
OK
127.0.0.1:6379>
lrange ids 0 -1
1) "
1"
修改命令
lset key index value修改指定下标的元素的值设置为value
127.0.0.1:6379>lset ids 0 0
OK
127.0.0.1:6379>
lrange ids 0 -1
1) "
0"
阻塞弹出命令
blpop key [key &
hellip;
] timeout移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时(单位秒)或发现可弹出元素为止
brpop key [key &
hellip;
] timeout移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止演示:开启三个reids连接窗口,第一个执行blpop ,第二个执行brpop ,第三个执行添加:可以看到窗口1和2执行完都已经阻塞在这里,这是因为ids中没有元素
窗口3执行添加:lpush ids 1 2 3 4 5 6可以看到窗口1和2立即弹出对应元素:
应用场景消息队列:lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能
朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。
List是Redis中很重要的一种数据类型,用于存储有序的字符串列表。与常见的队列模型(如FIFO)相似,List常用于任务队列、消息队列等场景中。本文将详细介绍Redis中List的相关命令以及如何使用它们,帮助读者更好地理解和使用这个强大的数据类型。
一、LPUSH / RPUSH命令
LPUSH与RPUSH分别代表“左侧插入”和“右侧插入”,即在List的左端或右端插入一个或多个元素。这两个命令的用法是相同的,只是插入的方向不同。
二、LPOP / RPOP命令
LPOP与RPOP分别代表“左侧弹出”和“右侧弹出”,即从List的左侧或右侧弹出一个元素并删除。这两个命令的用法也是相同的,只是弹出的方向不同。
三、LINDEX命令
LINDEX命令用于获取List中指定下标的元素,下标从0开始计数。如果需要获取最后一个元素,可以将下标设置为-1。
四、LLEN命令
LLEN命令用于获取List的长度,即元素的总数。
五、LRANGE命令
LRANGE命令用于获取List中指定范围的元素,范围的两个端点可以是任意下标。例:LRANGE mylist 0 2 返回List mylist中下标从0到2的元素。
六、LSET命令
LSET命令用于设置List中指定下标的元素值。如果下标不存在,LSET会返回一个错误。值得注意的是,LSET的时间复杂度为O(n)。
七、LTRIM命令
LTRIM命令用于截取List中指定范围内的元素,这个范围是指从start下标到end下标的元素,两端点包含在内。使用LTRIM会立即影响到List的长度。
在实际应用中,List数据类型的功能非常强大。它不仅适合于简单的队列模型,还可以用于实现跳跃表、限制长度、并发访问等复杂的数据结构。正确掌握List相关的命令对于Redis的使用也将大有裨益。
总结
本文介绍了List中的七个常用命令,LRANGE等多个命令灵活使用能够提升程序能力。List可以作为一个基础的数据类型,在实际应用中带来很多的帮助。让我们共同掌握Redis中的List数据类型,为我们的编程之路打下坚实的基础。