如何管理 Redis 中的列表
源地址:https://www.digitalocean.com/community/cheatsheets/how-to-manage-lists-in-redis
作者:Mark Drake
简介
Redis 是一个开源的、运行在内存中的键值数据库。在 Redis 中,除非显式指明,否则列表是类似于链接列表(linked list)按插入顺序排序的字符串的集合。本教程详细介绍了如何创建列表以及从列表中检索和删除元素。
如何使用这个教程
这个教程是以小抄(Cheat Sheet)的形式写的,有对应的例子。我们鼓励你直接跳转到和你要完成的任务相关的章节进行阅读。
这个教程中的命令在 Ubuntu 18.04 中的 Redis 4.0.9 版本完成测试。如果你需要建设一个同样的环境,可以参考我们的 如何在 Ubuntu 18.04 上安装并加固 Redis 中的 Step 1 来安装 Redis。我们将通过 Redis 命令行界面redis-cli
运行这些命令,来演示这些命令的行为。请注意,如果你使用不同的 Redis 工具--例如Redli —— 某些命令的实际输出可能有所不同。
此外,你还可以使用一个代管的 Redis 数据库实例来测试这些命令。但需要注意的是,根据你的数据库服务提供商的限制,这个教程中的某些命令可能运行效果和教程不一致。如果想要使用 DigitalOcean 提供的代管数据库,可以查看我们的代管数据库产品文档。使用代管 Redis 数据库实例时,你必须安装 Redli或设置 TLS 隧道 来通过 TLS 链接到代管数据库。
创建列表
一个键只能保存一个列表,每个列表可以保存超过 40 亿个元素。Redis 从左到右读取列表,你可以使用 lpush
命令将新列表元素添加到列表的头部("左"端)或使用 rpush
将新列表元素添加到列表的尾部("右"端)。你还可以使用 lpush
或 rpush
创建一个新列表:
127.0.0.1:6379> lpush key value
这两个命令都将输出一个整数,以显示列表中有多少元素。为了说明,运行以下命令来创建一个包含格言"I think therefore I am"的列表:
127.0.0.1:6379> lpush key_philosophy1 "therefore"
127.0.0.1:6379> lpush key_philosophy1 "think"
127.0.0.1:6379> rpush key_philosophy1 "I"
127.0.0.1:6379> lpush key_philosophy1 "I"
127.0.0.1:6379> rpush key_philosophy1 "am"
最后一个命令的返回如下:
输出
(integer) 5
请注意,你可以使用单个 lpush
或 rpush
语句添加多个列表元素:
127.0.0.1:6379> rpush key_philosophy1 "-" "Rene" "Decartes"
lpushx
和 rpushx
命令也用于将元素添加到列表中,但仅在给定列表已经存在时才有效。如果任一命令失败,它将返回 (integer) 0
:
127.0.0.1:6379> rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "-" "Aristotle"
输出
(integer) 0
要更改列表中的现有元素,请运行 lset
命令,后跟键名、要更改的元素的索引以及新的值:
127.0.0.1:6379> lset key_philosophy1 5 "sayeth"
如果你尝试将列表元素添加到不包含列表的现有键中,则会导致数据类型冲突并返回错误。例如,下面的 set
命令会创建一个包含字符串的键,因此下面尝试使用 lpush
向其中添加列表元素的操作将会失败:
127.0.0.1:6379> set key_philosophy3 "What is love?"
127.0.0.1:6379> lpush key_philosophy3 "Baby don't hurt me"
输出
(error) WRONGTYPE Operation against a key holding the wrong kind of value
目前还无法将 Redis 键值对从一种数据类型转换为另一种数据类型,因此要将 key_philosophy3
转换为列表,你需要删除键并使用 lpush
或 rpush
命令重新开始。
从列表中提取元素
如果想要从列表中提取一系列元素,可以使用包含一个开始偏移量 和结束偏移量的 lrange
命令来获取。每个偏移量都是从零开始的,这意味着0
代表列表中的第一个元素,1
代表下一个元素,依此类推。
以下命令将返回上一节中创建的示例列表中的所有元素:
127.0.0.1:6379> lrange key_philosophy1 0 7
输出
1) "I"
2) "think"
3) "therefore"
4) "I"
5) "am"
6) "sayeth"
7) "Rene"
8) "Decartes"
传递给 lrange
的偏移量也可以是负数。在这种情况下使用时,-1
表示列表中的最后一个元素,-2
表示列表中的倒数第二个元素,依此类推。以下示例返回 key_philosophy1
中保存的列表的最后三个元素:
127.0.0.1:6379> lrange key_philosophy1 -3 -1
输出
1) "I"
2) "am"
3) "sayeth"
要从列表中获取单个元素,可以使用 lindex
命令。但是,此命令要求你提供元素的索引作为参数。与 lrange
一样,索引是从零开始的,这意味着第一个元素在索引 0
处,第二个在索引 1
处,依此类推:
127.0.0.1:6379> lindex key_philosophy1 4
输出
"am"
要找出给定列表中有多少元素,请使用 llen
命令,它是“list length”:
127.0.0.1:6379> llen key_philosophy1
输出
(integer) 8
如果存储在给定键的值不存在,llen
将返回错误。
从列表中删除元素
lrem
命令删除与给定值匹配的定义数量的出现中的第一个。要测试这个功能,需要先创建以下列表:
127.0.0.1:6379> rpush key_Bond "Never" "Say" "Never" "Again" "You" "Only" "Live" "Twice" "Live" "and" "Let" "Die" "Tomorrow" "Never" "Dies"
以下 lrem
命令将删除第一次出现的 "Live"
:
127.0.0.1:6379> lrem key_Bond 1 "Live"
此命令将输出从列表中删除的元素数量:
输出
(integer) 1
传递给“lrem”命令的数字也可以是负数。以下命令将删除最后两次出现的 "Never":
127.0.0.1:6379> lrem key_Bond -2 "Never"
输出
(integer) 2
lpop
命令从列表中删除并返回第一个或“最左边”的元素:
127.0.0.1:6379> lpop key_Bond
输出
"Never"
同样,要从列表中删除并返回最后一个或“最右边”的元素,请使用 rpop
:
127.0.0.1:6379> rpop key_Bond
输出
"Dies"
Redis 还包括 rpoplpush
命令,该命令从列表中删除最后一个元素并将其推送到另一个列表的开头:
127.0.0.1:6379> rpoplpush key_Bond key_AfterToday
输出
"Tomorrow"
如果传递给 rpoplpush
命令的源键和目标键相同,它将实现旋转列表中的元素的功能。
总结
本指南详细介绍了一些可用于在 Redis 中创建和管理列表的命令。