【redis实战】Redis命令之列表

常见命令

列表的主要优点在于它可以包含多个字符串值,使得用户可以将数据集中在同一个地方。Redis允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。

命令用例描述注意
rpushrpush key value [value …]从右端推入一个或多个值多个值用空格隔开
lpushlpush key value [value …]从左端推入一个或多个值多个值用空格隔开
rpoprpop key移除最右端的元素如果列表已经为空,则返回nil
lpoplop key移除最左端的元素如果列表已经为空,则返回nil
lindexlindex key offset查找偏移量为offset的元素如果offset不存在,则返回nil
lrangelrange key start end查找偏移量在start和end之间的元素包含start和end的元素,0为第一个,-1为最后一个
ltrimltrim 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

01234
-5-4-3-2-1
str5str4str3str2str1

用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,但是可以一次弹出多个元素的操作。

其他命令

可以实现:

  • 阻塞执行命令的客户端直到有其他客户端给列表添加元素为止;
  • 将元素从一个列表转移到另一个列表。
命令用例描述
blpopblpop key [key …] timeout弹出一个或多个列表最左端的元素,或者在timeout秒内阻塞直到有可弹出的元素出现
brpopbrpop key [key …] timeout弹出一个或多个列表最右端的元素,或者在timeout秒内阻塞直到有可弹出的元素出现
rpoplpushrpoplpush source-key dest-key从列表source右端弹出并从列表dest的左端推入, 并向用户返回这个元素
brpoplpushbrpoplpush 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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值