Redis常用命令--Lists

时间:2022-11-26 20:33:02

List是一个双向链表,按照插入顺序排序,可以添加一个元素到头部或者尾部。当对一个空key执行插入操作的时候会创建一个新表。

如果要清空列表,则会杀出对应的key空间。

在List中保存了头节点和未节点,以及链表包含的节点数量。所以查询链表中节点数量的复杂度为O(1)。

在List中保存的每个节点都保存了前一个节点,后一个节点,以及节点本身。

头结点的前一个节点为NULL,尾节点的后一个节点为NULL。

在Redis中提供了大概17个操作list的命令。

LPUSH key value[value ....]:从队列的左边入队一个或多个元素,时间复杂度O(1)。

RPUSH key value[value...]:从队列的右边入队一个或多个元素,时间复杂度O(1)。

LPOP key:从队列的左边出队一个元素,时间复杂度O(1)。

RPOP key:从队列的右边出队一个元素,时间复杂度O(1)。

LPUSHX key value:当队列存在时,从队列左边入队一个元素,时间复杂度O(1)。

RPUSHX key value:当队列存在时,从队列右边入队一个元素,时间复杂度O(1)。

LSET key index value:设置队列里面一个元素的值

LINDEX key index:返回下标为index的元素

LLEN key:获取队列的长度

LTRIM key start stop:剪裁列表到指定范围内的清单

LINSERT key BEFORE|AFTER pivot value:在列表中的另一个元素之前或之后插入一个元素

LREM key count value:从列表中删除元素,时间复杂度为O(N)。

  count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count

  count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值

  count=0:移除表中所有与value相等的元素。

127.0.0.1:6379> lpush names a b c
(integer) 3
127.0.0.1:6379> rpush names d e
(integer) 5
127.0.0.1:6379> type names
list
127.0.0.1:6379> lpop names
"c"
127.0.0.1:6379> rpop names
"e"
127.0.0.1:6379> lpushx names f
(integer) 4
127.0.0.1:6379> rpushx names g
(integer) 5
127.0.0.1:6379> lpushx names2 h
(integer) 0
127.0.0.1:6379> rpushx names2 i
(integer) 0
127.0.0.1:6379> llen names
(integer) 5
127.0.0.1:6379> lset names 2 o
OK
127.0.0.1:6379> lindex names 2
"o"
127.0.0.1:6379> len names
(error) ERR unknown command 'len'
127.0.0.1:6379> llen names
(integer) 5
127.0.0.1:6379> linsert names before h hh
(integer) -1
127.0.0.1:6379> linsert names before g gg
(integer) 6
127.0.0.1:6379> ltrim names 2 4
OK
127.0.0.1:6379> llen names
(integer) 3
127.0.0.1:6379> lpop names
"o"
127.0.0.1:6379> lrem names 1 o
(integer) 0
127.0.0.1:6379> lpop names
"d"
127.0.0.1:6379>

BLPOP key [key ...] timeout:弹出该列表中的第一个元素,或阻塞,直到有一个可用

BRPOP key [key ...] timeout:弹出该列表中的最后一个元素,或阻塞,直到有一个可用

127.0.0.1:6379> lpush names zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> BLPOP names zhangsan 1
1) "names"
2) "wangwu"
127.0.0.1:6379> BRPOP names
(error) ERR wrong number of arguments for 'brpop' command
127.0.0.1:6379> BRPOP names 1
1) "names"
2) "zhangsan"
127.0.0.1:6379> BRPOP names 5
1) "names"
2) "lisi"
127.0.0.1:6379> BRPOP names 5
(nil)
(5.09s)
#没有数据进来的时候,就超时了
127.0.0.1:6379> 127.0.0.1:6379> BRPOP names 50
#这时候处于等待状态
#我们再开启一个客户端
[root@localhost 18:39 ~]# redis-cli
127.0.0.1:6379> lpush names fuwh
(integer) 1
127.0.0.1:6379>
#这时候,这边就或在阻塞的时候,获取到
1) "names"
2) "fuwh"
(20.97s)
127.0.0.1:6379>

RPOPLPUSH source destination:删除列表中的最后一个元素,将其追加到另一个列表

BRPOPLPUSH source destination timeout:弹出一个列表的值,将它推到另外一个列表,并返回它或阻塞,直到有一个可用

127.0.0.1:6379> lpush ages 18 19 20
(integer) 3
127.0.0.1:6379> lpush names zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> llen names
(integer) 3
127.0.0.1:6379> llen ages
(integer) 3
127.0.0.1:6379> RPOPLPUSH names ages
"zhangsan"
127.0.0.1:6379> lpop ages
"zhangsan"
127.0.0.1:6379> RPOPLPUSH names ages
"lisi"
127.0.0.1:6379> lpop ages
"lisi"
127.0.0.1:6379> RPOPLPUSH names ages
"wangwu"
127.0.0.1:6379> lpop ages
"wangwu"
127.0.0.1:6379> llen ages
(integer) 3
127.0.0.1:6379> BRPOPLPUSH names ages 100
#此时names中没有数据,处于阻塞状态
#另外启动一个客户端,给names里面push数据
127.0.0.1:6379> lpush names zhangsan
(integer) 1
127.0.0.1:6379>
#----------------------------
"zhangsan"
(11.47s)
127.0.0.1:6379> llen ages
(integer) 4
127.0.0.1:6379> lpop ages
"zhangsan"
127.0.0.1:6379>