Redis实战-Redis五种数据类型(四-2 列表)
2019-04-29 本文已影响4人
擦普洱
2.列表
Redis的列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。除此之外,列表还可以用来存储任务信息,最近浏览过的文章或者常用联系人信息。
下面将对列表这个用多个字符串值组成的有序序列结构进行介绍,并展示一些最常用的列表处理命令。
命令 | 用例和描述 |
---|---|
RPUSH | RPUSH key-name value [value ...] --将一个或多个值推入列表的右端 |
LPUSH | LPUSH key-name value [value ...] --将一个或多个值推入列表的左端 |
RPOP | RPOP key-name --移除并返回列表最右端的元素 |
LPOP | LPOP key-name --移除并返回列表最左端的元素 |
LINDEX | LINDEX key-name offset --返回列表中偏移量为offset的元素 |
LRANGE | LRANGE key-name start end --返回列表从start偏移量到end偏移量范围内的所有元素,其中偏移量为start和偏移量为end的元素也会包含被返回的元素中 |
LTRIM | LTRIM key-name start end --对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会被保留 |
下面将进行示例展示:
#向列表推入元素后,返回列表当前的长度
127.0.0.1:6379> rpush list-key last
(integer) 1
127.0.0.1:6379> lpush list-key first
(integer) 2
127.0.0.1:6379> rpush list-key new last
(integer) 4
#返回列表0到-1之间的所有元素,当end的值为负数的时候,返回的是当前列表中所有的元素
127.0.0.1:6379> lrange list-key 0 -1
1) "first"
2) "last"
3) "new"
4) "last"
#通过重复的弹出列表左端的元素,可以按照从左到右的顺序来获取列表中的元素
127.0.0.1:6379> lpop list-key
"first"
127.0.0.1:6379> lpop list-key
"last"
127.0.0.1:6379> lrange list-key 0 -1
1) "new"
2) "last"
#可以同时推入多个元素
127.0.0.1:6379> rpush list-key a b c
(integer) 5
127.0.0.1:6379> lrange list-key 0 -1
1) "new"
2) "last"
3) "a"
4) "b"
5) "c"
#可以从列表的左端、右端或者左右两端删减任意数量的元素
127.0.0.1:6379> ltrim list-key 2 -1
OK
127.0.0.1:6379> lrange list-key 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379>
上述示例第一次用到了LTRIM命令,组合使用LTRIM和LRANGE可以构建出一个在功能上类似于LPOP或RPOP,但是却能够返回并弹出多个元素的操作。
有几个列表命令可以将元素从一个列表移动到另一个列表,或者阻塞(block)执行命令的客户端直到有其他客户端给列表添加元素为止,下面将列出这些阻塞弹出命令和元素移动命令。
阻塞式的列表弹出命令以及在列表之间移动元素的命令
命令 | 用例和描述 |
---|---|
BLPOP | BLPOP key-name [key-name ...] timeout --从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 |
BRPOP | BRPOP key-name [key-name ...] timeout --从第一个非空列表中弹出最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 |
RPOPLPUSH | RPOPLPUSH source-key dest-key --从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key 列表的最左端,并向用户返回这个元素 |
BRPOPLPUSH | BRPOPLPUSH source-key dest-key timeout --从source-key 列表中弹出位于最右端的元素,然后将这个元素推入dest-key 列表的最左端,并向用户返回这个元素;如果source-key 为空,那么在timeout 秒之内阻塞并等待可弹出的元素出现 |
下面将展示几个使用BRPOPLPUSH移动列表元素的例子以及使用BLPOP从列表里面弹出多个元素的例子。
#将一些元素添加到两个列表里面
127.0.0.1:6379> rpush list1 item1
(integer) 1
127.0.0.1:6379> rpush list1 item2
(integer) 2
127.0.0.1:6379> rpush list3 item3
(integer) 1
#将一个元素从一个列表移动到另一个列表,并返回被移动的元素
127.0.0.1:6379> brpoplpush list3 list1 1
"item3"
#当列表不包含任何元素时,阻塞谈弹出操作会在给定的时限内等待可弹出的元素出现,并在时限到达后返回None
127.0.0.1:6379> brpoplpush list3 list1 1
(nil)
(1.10s)
#返回list1的所有元素
127.0.0.1:6379> lrange list1 0 -1
1) "item3"
2) "item1"
3) "item2"
#弹出list3最后端的元素并将弹出的元素推入list1的左端
127.0.0.1:6379> brpoplpush list1 list3 1
"item2"
列表的一个主要优点在于它可以包含多个字符串值,这使得用户可以将数据集中在同一个地方。Redis的集合也提供了与列表类似的特性,但集合只能保存各不相同的元素。接下来的一节中就让我们来看看不能保存相同元素的集合都能做些什么。
不怕从零开始,只怕从未启程!
参考文献:
菜鸟教程:https://www.runoob.com/redis/redis-keys.html
《Redis实战》Josiah L. Carlson著