【redis】数据类型之list
Redis的List数据类型是一个双向链表,支持在链表的头部(left)和尾部(right)进行元素的插入(push)和弹出(pop)操作。这使得List既可以用作栈(stack),也可以用作队列(queue)。
有关list类型的命令可以通过help @list
命令来查看。有关命令的使用可以通过help 命令
来查看,例如help lpush
。
简单使用
LPUSH
lpush:在列表的左边插入元素。
语法:
LPUSH key element [element ...]
使用:
127.0.0.1:6379> lpush k1 a b c d
(integer) 4
LRANGE
lrange:查看列表中的元素。
语法:
LRANGE key start stop
使用:
127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
LPOP
lpop:从列表的左边取出一个元素。
语法:
LPOP key [count]
使用
127.0.0.1:6379> lpop k1
"d"
127.0.0.1:6379> lpop k1 3
1) "c"
2) "b"
3) "a"
RPUSH
rpush:在列表的右边插入元素。
语法:
RPUSH key element [element ...]
使用:
127.0.0.1:6379> rpush k1 a b c d
(integer) 4
RPOP
rpop:从列表的右边取出一个元素。
语法:
RPOP key [count]
使用:
127.0.0.1:6379> rpop k1
"d"
127.0.0.1:6379> rpop k1 3
1) "c"
2) "b"
3) "a"
LINDEX
lindex:查询指定索引的元素。
语法:
LINDEX key index
使用:
127.0.0.1:6379> lpush k1 a b c d
(integer) 4
127.0.0.1:6379> lindex k1 -1
"a"
LLEN
llen:获取列表的长度。
语法:
LLEN key
使用:
127.0.0.1:6379> llen k1
(integer) 4
LINSERT
linsert:在指定元素的前面或后面插入元素。
语法:
LINSERT key BEFORE|AFTER pivot element
使用:
127.0.0.1:6379> linsert k1 before b x
(integer) 5
127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "x"
4) "b"
5) "a"
LREM
lrem:根据指定个数的指定元素。
语法:
LREM key count element
使用:
127.0.0.1:6379> lrange k1 0 -1
1) "a"
2) "c"
3) "b"
4) "a"
5) "d"
6) "c"
7) "x"
8) "b"
9) "a"
127.0.0.1:6379> lrem k1 2 a
(integer) 2
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "c"
5) "x"
6) "b"
7) "a"
使用的lrem的注意事项:
-
指定的count超出列表中对应元素的个数,删除所有指定的元素。
-
count为负数,从右往左删除。
-
count为0,删除所有指定的元素。
-
count为正数,从左往右删除。
LSET
lset:设置指定索引位置的元素。
语法:
LSET key index element
使用:
127.0.0.1:6379> lset k1 3 y
OK
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "y"
5) "x"
6) "b"
7) "a"
LTRIM
ltrim:截取保留列表中指定索引的元素。
语法:
LTRIM key start stop
使用:
127.0.0.1:6379> ltrim k1 3 6
OK
127.0.0.1:6379> lrange k1 0 -1
1) "y"
2) "x"
3) "b"
4) "a"
LPOS
lpos:在列表中匹配第一个找到的元素,可以指定范围,默认从头到尾扫描。
语法:
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
使用:
127.0.0.1:6379> rpush k2 a b c 1 2 3 c c
(integer) 8
127.0.0.1:6379> lpos k2 c
(integer) 2
127.0.0.1:6379> lpos k2 c rank 2
(integer) 6
127.0.0.1:6379> lpos k2 c rank -1
(integer) 7
127.0.0.1:6379> lpos k2 c count 2
1) (integer) 2
2) (integer) 6
LMOVE
lmove:用于从一个列表弹出一个元素,并将其推入到另一个列表中。这个命令通常用于在两个列表之间转移元素,或者在处理消息队列时,从一个队列中取出任务并将其放入另一个队列中。
语法:
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
使用:
127.0.0.1:6379> lmove k1 k3 LEFT RIGHT
"y"
LPUSHX
lpushx:用于将一个或多个值插入到已存在的列表的头部(左端)。与LPUSH命令不同的是,如果指定的列表不存在,LPUSHX命令不会创建新列表,而是直接返回操作失败。
语法:
LPUSHX key element [element ...]
使用:
127.0.0.1:6379> lpushx k1 xx
(integer) 5
127.0.0.1:6379> lpushx kk xx
(integer) 0
RPOPLPUSH
rpoplpush:从源列表的右端(尾部)弹出一个元素,并将该元素插入到目标列表的左端(头部)。这个命令通常用于在两个列表之间安全地传递元素,特别是在实现队列或任务调度时非常有用。
语法:
RPOPLPUSH source destination
使用:
127.0.0.1:6379> rpoplpush k1 k3
"a"
RPUSHX
rpushx:用于将一个或多个值插入到已存在的列表的尾部(右端)。与RPUSH命令不同的是,如果指定的列表不存在,RPUSHX命令不会创建新列表,而是直接返回操作失败。
语法:
RPUSHX key element [element ...]
使用:
127.0.0.1:6379> rpushx k3 a b
(integer) 4
127.0.0.1:6379> rpushx kv a b
(integer) 0
阻塞命令的使用
BLMOVE
blmove:用于将一个元素从一个列表移动到另一个列表,并在源列表为空时阻塞操作,直到有元素可用或达到超时时间。
语法:
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
使用:
127.0.0.1:6379> blmove k1 k3 LEFT RIGHT 2000
"xx"
127.0.0.1:6379> blmove emptylist k3 LEFT RIGHT 2
(nil)
(2.03s)
BLPOP
blpop:从列表的左端(头部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。
语法:
BLPOP key [key ...] timeout
使用:
127.0.0.1:6379> blpop k1 2
1) "k1"
2) "xx"
127.0.0.1:6379> blpop emptylist 2
(nil)
(2.02s)
BRPOP
brpop:从列表的右端(尾部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。
语法:
BRPOP key [key ...] timeout
使用:
127.0.0.1:6379> brpop k1 2
1) "k1"
2) "b"
127.0.0.1:6379> brpop emptylist 2
(nil)
(2.02s)
BRPOPLPUSH
brpoplpush:BRPOPLPUSH命令的行为与RPOPLPUSH命令完全相同,即从source列表的尾部弹出一个元素,并将该元素推入到destination列表中。
当source列表为空时,Redis将阻塞连接,直到另一个客户端向source列表推送元素,或者直到指定的timeout时间达到。
语法:
BRPOPLPUSH source destination timeout
使用:
127.0.0.1:6379> brpoplpush k3 k4 2
"xx"
内部编码
列表类型的内部编码为quicklist
。
127.0.0.1:6379> rpush k3 a b c
(integer) 3
127.0.0.1:6379> object encoding k3
"quicklist"
使用场景
-
链表:lpush+rpop,rpush+lpop,反向命令的组合可以实现链表。
-
栈:lpush+lpop,rpush+rpop,同向命令的组合可以实现栈。
-
数组:rpush+lindex+lset,可以实现数组的功能。
-
消息队列:lpush+brpop。