引言

Redis 是一个开源的、内存中的键值数据存储。 在 Redis,list 是按插入顺序排序的字符串集合,类似于链表。 本教程介绍如何在 Redis 列表中创建和使用元素。

如何使用本指南

本指南是作为包含自包含示例的备忘单编写的。 我们鼓励您跳转到任何与您正在尝试完成的任务相关的部分。

本指南中显示的命令是在运行 Redis 4.0.9版本的 Ubuntu 18.04服务器上测试的。 要建立一个类似的环境,你可以按照我们关于如何在 Ubuntu 18.04上安装和保护 Redis 的指南的第一步。 我们将通过使用 Redis-cli (Redis 命令行界面)运行这些命令来演示它们的行为。 请注意,如果您使用的是不同的 Redis 接口ーー例如 Redli ーー某些命令的确切输出可能会有所不同。

或者,您可以提供一个托管 Redis 数据库实例来测试这些命令,但是请注意,根据您的数据库提供程序所允许的控制级别,本指南中的某些命令可能不能像描述的那样工作。 要提供一个数字数据库管理数据库,请遵循我们的管理数据库产品文档。 然后,必须安装 Redli 或设置 TLS 通道,以便通过 TLS 连接到托管数据库。

创建列表

一个键只能保存一个列表,尽管任何列表可以保存超过40亿个元素。 Redis 从左到右读取列表,您可以使用 lpush 命令将新的列表元素添加到列表的头部(“左”端) ,或者使用 rpush 将尾部(“右”端)添加到列表的头部。 你也可以使用 lpush 或 rpush 来创建一个新列表:

  • lpush key value

两个命令都将输出一个整数,显示列表中有多少个元素。 为了说明这一点,运行以下命令创建一个包含“我思故我在”格言的列表:

  • lpush key_philosophy1 "therefore"
  • lpush key_philosophy1 "think"
  • rpush key_philosophy1 "I"
  • lpush key_philosophy1 "I"
  • rpush key_philosophy1 "am"

最后一个命令的输出将为:

Output
(integer) 5

注意,您可以使用单个 lpush 或 rpush 语句添加多个列表元素:

  • rpush key_philosophy1 "-" "Rene" "Decartes"

Lpushx 和 rpushx 命令也用于将元素添加到列表中,但是只有在给定的列表已经存在的情况下才起作用。 如果其中一个命令失败,它将返回(integer)0:

  • rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "–" "Aristotle"
Output
(integer) 0

若要更改列表中的现有元素,请运行 lset 命令,后跟键名、要更改的元素的索引和新值:

  • lset key_philosophy1 5 "sayeth"

如果尝试将列表元素添加到不包含列表的现有键,将导致数据类型冲突并返回错误。 例如,下面的 set 命令创建了一个包含字符串的键,因此下面尝试用 lpush 向它添加一个 list 元素的尝试将失败:

  • set key_philosophy3 "What is love?"
  • lpush key_philosophy3 "Baby don't hurt me"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value

将 Redis 键从一种数据类型转换为另一种数据类型是不可能的,因此要将 key philosophy 转换为一个列表,您需要删除该键并使用 lpush 或 rpush 命令重新开始。

从列表中检索元素

若要检索列表中的项目范围,请使用 lrange 命令,后跟一个开始偏移量和一个停止偏移量。 每个偏移量都是一个从零开始的索引,这意味着0表示列表中的第一个元素,1表示下一个元素,依此类推。

下面的命令将返回上一节创建的示例列表中的所有元素:

  • lrange key_philosophy1 0 7
Output
1) "I" 2) "think" 3) "therefore" 4) "I" 5) "am" 6) "sayeth" 7) "Rene" 8) "Decartes"

传递给 lrange 的偏移量也可以是负数。 在这种情况下,-1表示列表中的最后一个元素,-2表示列表中倒数第二个元素,以此类推。 下面的示例返回列表的最后三个元素,这三个元素在关键的 philosophy 中使用:

  • lrange key_philosophy1 -3 -1
Output
1) "I" 2) "am" 3) "sayeth"

要从列表中检索单个元素,可以使用 lindex 命令。 但是,这个命令要求您提供元素的索引作为参数。 与 lrange 一样,index 是从零开始的,这意味着第一个元素位于 index 0,第二个元素位于 index 1,依此类推:

  • lindex key_philosophy1 4
Output
"am"

要查明给定列表中有多少个元素,可以使用 llen 命令,它是“ l ist len gth”的缩写:

  • llen key_philosophy1
Output
(integer) 8

如果存储在给定键上的值不存在,llen 将返回一个错误。

从列表中删除元素

Lrem 命令删除已定义的与给定值匹配的事件数中的第一个。 为了实验这一点,创建以下列表:

  • rpush key_Bond "Never" "Say" "Never" "Again" "You" "Only" "Live" "Twice" "Live" "and" "Let" "Die" "Tomorrow" "Never" "Dies"

下面的 lrem 示例将删除“ Live”的第一个值:

  • lrem key_Bond 1 "Live"

这个命令将输出从列表中移除的元素数:

Output
(integer) 1

传递给 lrem 命令的数字也可以是负数。 下面的示例将删除最后两次出现的值“ Never” :

  • lrem key_Bond -2 "Never"
Output
(integer) 2

Lpop 命令从列表中删除并返回第一个或“最左边”元素:

  • lpop key_Bond
Output
"Never"

同样,要从列表中删除并返回最后一个或“最右边”元素,可以使用 rpop:

  • rpop key_Bond
Output
"Dies"

Redis 还包含 rpoplpush 命令,该命令从一个列表中删除最后一个元素,并将其推到另一个列表的开头:

  • rpoplpush key_Bond key_AfterToday
Output
"Tomorrow"

如果传递给 rpoplpush 命令的源键和目标键相同,那么它实际上将对列表中的元素进行旋转。

总结

本指南详细介绍了一些命令,可用于在 Redis 创建和管理列表。 如果还有其他相关的命令、参数或者程序你想在本指南中看到,请在下面的评论中询问或者提出建议。

有关 Redis 命令的更多信息,请参见我们关于如何管理 Redis 数据库的系列教程。