如何管理 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 将新列表元素添加到列表的尾部("右"端)。你还可以使用 lpushrpush 创建一个新列表:

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

请注意,你可以使用单个 lpushrpush 语句添加多个列表元素:

127.0.0.1:6379>  rpush key_philosophy1 "-" "Rene" "Decartes"

lpushxrpushx 命令也用于将元素添加到列表中,但仅在给定列表已经存在时才有效。如果任一命令失败,它将返回 (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 转换为列表,你需要删除键并使用 lpushrpush 命令重新开始。

从列表中提取元素

如果想要从列表中提取一系列元素,可以使用包含一个开始偏移量 和结束偏移量的 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 中创建和管理列表的命令。