常见命令
列表的主要优点在于它可以包含多个字符串值,使得用户可以将数据集中在同一个地方。Redis允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。
命令 | 用例 | 描述 | 注意 |
---|---|---|---|
rpush | rpush key value [value …] | 从右端推入一个或多个值 | 多个值用空格隔开 |
lpush | lpush key value [value …] | 从左端推入一个或多个值 | 多个值用空格隔开 |
rpop | rpop key | 移除最右端的元素 | 如果列表已经为空,则返回nil |
lpop | lop key | 移除最左端的元素 | 如果列表已经为空,则返回nil |
lindex | lindex key offset | 查找偏移量为offset的元素 | 如果offset不存在,则返回nil |
lrange | lrange key start end | 查找偏移量在start和end之间的元素 | 包含start和end的元素,0为第一个,-1为最后一个 |
ltrim | ltrim key start end | 对列表进行修剪,只保留start和end偏移量之间的元素 | 包含start和end,0为第一个,-1为最后一个 |
示例
右端推入
127.0.0.1:6379> rpush list1 s1 s2
(integer) 2
查看元素
127.0.0.1:6379> lrange list1 0 -1
1) "s1"
2) "s2"
移除最右端元素,如果列表已经为空,则返回nil
127.0.0.1:6379> rpop list1
"s2"
127.0.0.1:6379> rpop list1
"s1"
127.0.0.1:6379> rpop list1
(nil)
左端推入
127.0.0.1:6379> lpush list1 s1
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "list1"
127.0.0.1:6379> lpush list1 s2 s3 s4 s5
(integer) 2
根据偏移量offset查找元素,如果偏移量不存在,则返回nil
127.0.0.1:6379> lindex list1 0
"list1"
127.0.0.1:6379> lindex list1 6
(nil)
修剪列表
127.0.0.1:6379> lrange list1 0 -1
1) "s5"
2) "s4" -- start=1
3) "s3" -- end=2
4) "s2"
5) "s1"
127.0.0.1:6379> ltrim list1 1 2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "s4"
2) "s3"
例如列表元素为: str5l str4 str3 str2 str1
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
-5 | -4 | -3 | -2 | -1 |
str5 | str4 | str3 | str2 | str1 |
用lindex验证偏移量为0和-1的值是否等
127.0.0.1:6379> lrange list1 0 -1
1) "list5"
2) "list4"
3) "list3"
4) "list2"
5) "list1"
127.0.0.1:6379> lindex list1 0
"str5"
127.0.0.1:6379> lindex list1 1
"str4"
127.0.0.1:6379> lindex list1 2
"str3"
127.0.0.1:6379> lindex list1 3
"str2"
127.0.0.1:6379> lindex list1 4
"str1"
127.0.0.1:6379> lindex list1 -1
"str1"
127.0.0.1:6379> lindex list1 -2
"str2"
127.0.0.1:6379> lindex list1 -3
"str3"
127.0.0.1:6379> lindex list1 -4
"str4"
127.0.0.1:6379> lindex list1 -5
"str5"
ltrim和lrange可以构建出一个在功能上类似于lpop和rpop,但是可以一次弹出多个元素的操作。
其他命令
可以实现:
- 阻塞执行命令的客户端直到有其他客户端给列表添加元素为止;
- 将元素从一个列表转移到另一个列表。
命令 | 用例 | 描述 |
---|---|---|
blpop | blpop key [key …] timeout | 弹出一个或多个列表最左端的元素,或者在timeout秒内阻塞直到有可弹出的元素出现 |
brpop | brpop key [key …] timeout | 弹出一个或多个列表最右端的元素,或者在timeout秒内阻塞直到有可弹出的元素出现 |
rpoplpush | rpoplpush source-key dest-key | 从列表source右端弹出并从列表dest的左端推入, 并向用户返回这个元素 |
brpoplpush | brpoplpush source-key dest-key timeout | 从列表source右端弹出并从列表dest的左端推入, 并向用户返回这个元素, 如果source为空那么会在timeout秒内阻塞并等待可弹出的元素出现 |
例如:
阻塞弹出元素
127.0.0.1:6379> lrange list1 0 -1
1) "s4"
2) "s3"
127.0.0.1:6379> blpop list1 10
1) "list1"
2) "s4"
127.0.0.1:6379> lrange list1 0 -1
1) "s3"
127.0.0.1:6379> blpop list1 10000
1) "list1"
2) "s3"
阻塞等待要弹出的元素
客户端1:
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> blpop list1 10000
新打开客户端2,并lpush一个新元素
~ redis-cli
127.0.0.1:6379> lpush list1 newStr
(integer) 1
客户端1的变化:
127.0.0.1:6379> blpop list1 10000
1) "list1"
2) "newStr"
(82.76s)
列表间转移元素
127.0.0.1:6379> lrange list1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange list2 0 -1
1) "s2"
2) "s1"
# 将list1 的元素转移到list2中
127.0.0.1:6379> rpoplpush list1 list2
"v1"
127.0.0.1:6379> rpoplpush list1 list2
"v2"
127.0.0.1:6379> rpoplpush list1 list2
"v3"
127.0.0.1:6379> rpoplpush list1 list2
(nil)
# 结果
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> lrange list2 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "s2"
5) "s1"