首页 / REDIS / redis--v类型List
redis--v类型List
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了redis--v类型List,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6407字,纯文字阅读大概需要10分钟。
内容图文
![redis--v类型List](/upload/InfoBanner/zyjiaocheng/863/5c546cc46bf944a89c6926067780bfe9.jpg)
List
类型介绍
-
Redis中的List和Java中的List类似,可以存放很多东西,
-
注意:Redis中的List底层实现是链表(类似于Java中的LinkedList)
-
补充一下:Java中的ArrayList和LinkedList
-
ArrayList:底层是动态数组(可以扩容的数组), 根据索引查询数据很快, 随机插入/删除很慢(因为要进行元素移动)
-
LinkedList:底层是双向链表 ,插入/删除很快, 挨个遍历(根据索引遍历)很慢
命令列表
命令原型 | 时间复杂度 | 命令描述 | 返回值 |
---|---|---|---|
LPUSHkey value [value …] | O(1) | 在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 | 插入后链表中元素的数量。 |
LPUSHX key value | O(1) | 仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的头部插入参数中给出的Value,否则将不会有任何操作发生。 | 插入后链表中元素的数量。 |
LRANGE key start stop | O(S+N) | 时间复杂度中的S为start参数表示的偏移量,N表示元素的数量。该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。 | 返回指定范围内元素的列表。 |
LPOPkey | O(1) | 返回并弹出指定Key关联的链表中的第一个元素,即头部元素,。如果该Key不存,返回nil。 | 链表头部的元素。 |
LLENkey | O(1) | 返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。 | 链表中元素的数量。 |
LREMkey count value | O(N) | 时间复杂度中N表示链表中元素的数量。在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0。 | 返回被删除的元素数量。 |
LSETkey index value | O(N) | 时间复杂度中N表示链表中元素的数量。但是设定头部或尾部的元素时,其时间复杂度为O(1)。设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。 | 如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。 |
LINDEX key index | O(N) | 时间复杂度中N表示在找到该元素时需要遍历的元素数量。对于头部或尾部元素,其时间复杂度为O(1)。该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。 返回请求的元素,如果index超出范围,则返回nil。 | |
LTRIMkey start stop | O(N) | N表示被删除的元素数量。该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素。和其他命令一样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。 | |
LINSERT key BEFORE AFTER pivot value | O(N) | 时间复杂度中N表示在找到该元素pivot之前需要遍历的元素数量。这样意味着如果pivot位于链表的头部或尾部时,该命令的时间复杂度为O(1)。该命令的功能是在pivot元素的前面或后面插入参数中的元素value。如果Key不存在,该命令将不执行任何操作。如果与Key关联的Value类型不是链表,相关的错误信息将被返回。 成功插入后链表中元素的数量,如果没有找到pivot,返回-1,如果key不存在,返回0。 | |
RPUSH key value [value …] | O(1) | 在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 | 插入后链表中元素的数量。 |
RPUSHX key value | O(1) | 仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的尾部插入参数中给出的Value,否则将不会有任何操作发生。 | 插入后链表中元素的数量。 |
RPOPkey | O(1) | 返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。 | 链表尾部的元素。 |
RPOPLPUSH source destination | O(1) | 原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。 | 返回弹出和插入的元素。 |
命令实例
?先从左边往list中添加元素,再从右边往list中添加元素 -- c b a 1 2 3
左c b a 1 2 3右
node01:6379> lpush mylist a b c
(integer) 3
node01:6379> rpush mylist 1 2 3
(integer) 6
?查看list的长度
node01:6379> llen mylist
(integer) 6
?查看list中的元素
node01:6379> lrange mylist 0 5
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
node01:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
?获取索引为1的元素
node01:6379> lindex mylist 1
"b"
?从list左边弹出一个元素再从右边弹出一个元素
cba123
node01:6379> lpop mylist
"c"
node01:6379> rpop mylist
"3"
node01:6379> lrange mylist 0 -1
1) "b"
2) "a"
3) "1"
4) "2"
阻塞列队
?从list中弹出一个元素,如果有直接弹出,如果没有等待10s(等待的过程中,如果有元素放入则立即获取到并弹出),如果时间结束后依然没有,则返回空
blpop mylist2 10
或者brpop mylist2 10
开启另一个客户端往list中添加元素
/export/servers/redis/bin/redis-cli -h node01
lpush mylist2 a
注意:如果超时时间设置为 0,表示永久阻塞等待, 直到有数据产生,一般不用
面试题:
?从list1中右侧弹出一个元素, 将这个元素从左侧添加到list2
node01:6379> lpush list1 1 2
(integer) 2
node01:6379> lpush list2 a b
(integer) 2
node01:6379> lrange list1 0 -1
1) "2"
2) "1"
node01:6379> lrange list2 0 -1
1) "b"
2) "a"
node01:6379> rpoplpush list1 list2
"1"
node01:6379> lrange list2 0 -1
1) "1"
2) "b"
3) "a"
?从list中删除2个指定的元素
lpush mylist3 a b c a b c a b c
node01:6379> lrange mylist3 0 -1
1) "c"
2) "b"
3) "a"
4) "c"
5) "b"
6) "a"
7) "c"
8) "b"
9) "a"
node01:6379> lrem mylist3 2 a
(integer) 2
node01:6379> lrange mylist3 0 -1
1) "c"
2) "b"
3) "c"
4) "b"
5) "c"
6) "b"
7) "a"
?设置指定位置的元素为新值
node01:6379> lindex mylist3 0
"c"
node01:6379> lset mylist3 0 x
OK
node01:6379> lindex mylist3 0
"x"
?设置保留指定索引的元素[0,2]
node01:6379> lrange mylist3 0 -1
1) "x"
2) "b"
3) "c"
4) "b"
5) "c"
6) "b"
7) "a"
node01:6379> ltrim mylist3 0 2
OK
node01:6379> lrange mylist3 0 -1
1) "x"
2) "b"
3) "c"
?往指定元素前/后插入元素
node01:6379> linsert mylist3 before c cc
(integer) 4
node01:6379> lrange mylist3 0 -1
1) "x"
2) "b"
3) "cc"
4) "c"
扩展-应用场景
- 1.可以使用Redis中的List(底层是双向链表) , 模拟阻塞队列, 模型双端队列, 模拟栈
- 2.热门微博的评论列表可以放在list中
- 3.用lrange可以获取指定索引范围的元素,也就是可以实现分页效果
- 注意:
- 队列:先进先出
- 双端队列:可以左右进,也可以左右出(所以才可以模拟栈)
- 栈:先进后出
- 注意:java中的Stack使用的是Vector实现(Vector底层是数组)
内容总结
以上是互联网集市为您收集整理的redis--v类型List全部内容,希望文章能够帮你解决redis--v类型List所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。