在 Redis 中怎么使用 Lists

系列教程导航

本教程属于 Redis 管理系列的一部分,您可以参考以下相关指南:

  1. 如何在 ubuntu18.04 上安装和保护 redis
  2. 如何连接到 Redis 数据库
  3. 如何管理 Redis 数据库和 Keys
  4. 如何在 Redis 中管理副本和客户端
  5. 如何在 Redis 中管理字符串
  6. 如何在 Redis 中管理 list
  7. 如何在 Redis 中管理 Hashes
  8. 如何在 Redis 中管理 Sets
  9. 如何在 Redis 中管理 Sorted Sets
  10. 如何在 Redis 中运行事务
  11. 如何使 Redis 中的 Key 失效
  12. 如何解决 Redis 中的故障
  13. 如何从命令行更改 Redis 的配置
  14. Redis 数据类型简介

介绍

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

如何使用本指南

本指南以备有完整示例的速查表(Cheat Sheet)形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行 Redis 版本 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境,您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis步骤 1 进行操作。我们将通过使用 Redis 命令行界面(redis-cli)运行它们来演示这些命令的行为。请注意,如果您使用其他 Redis 界面(例如 Redli),则某些命令的确切输出可能会有所不同。

另外,您可以提供一个托管的 Redis 数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库,请遵循我们的 托管数据库产品文档。然后,您必须 安装 Redli 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。

创建列表

一个键(Key)只能容纳一个列表,尽管任何列表都可以容纳多达 40 亿个元素。Redis 从左到右读取列表,您可以使用命令将新列表元素添加到列表的开头(“左”端),例如 lpush;也可以使用尾部(“右”端)添加新元素,例如 rpush。您还可以使用 lpushrpush 创建新列表:

lpush key value

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

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

最后一条命令的输出将显示为:

(integer) 5

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

rpush key_philosophy1 "-" "Rene" "Decartes"

lpushxrpushx 命令也用于将元素添加到列表中,但仅当给定的列表已经存在时才会生效。如果任何一个命令失败(即键不存在或不是列表),它将返回 (integer) 0

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

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

lset key_philosophy1 5 "sayeth"

如果尝试将列表元素添加到不包含列表的现有键中,则会导致数据类型冲突并返回错误。例如,以下 set 命令创建一个保存字符串的键,因此以下尝试向其中添加列表元素的 lpush 操作将失败:

set key_philosophy3 "What is love?"
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 命令,后跟起始 偏移量 (Offset)) 和终止偏移量。每个偏移量都是从零开始的索引,0 表示列表中的第一个元素,1 代表下一个,依此类推。

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

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 中的最后三个元素:

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

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

lindex key_philosophy1 4
"am"

要查找给定列表中有多少个元素,请使用 llen 命令,该命令是"list length"的缩写:

llen key_philosophy1
(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"

此命令将输出从列表中删除的元素数量:

(integer) 1

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

lrem key_Bond -2 "Never"
(integer) 2

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

lpop key_Bond
"Never"

同样,要从列表中删除并返回最后或“最右边”的元素,请使用 rpop

rpop key_Bond
"Dies"

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

rpoplpush key_Bond key_AfterToday
"Tomorrow"

如果传递给 rpoplpush 命令的源键和目标键相同,则它将实质上旋转列表中的元素。

结论

本指南详细介绍了可用于在 Redis 中创建和管理列表的许多命令。如果您想在本指南中概述其他相关的命令、参数或过程,请在下面的评论中提出疑问或提出建议。

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

说明

版本时效性说明:本文基于 Redis 4.0.9 版本及 Ubuntu 18.04 环境编写。虽然核心列表命令在后续版本中保持稳定,但部分输出格式或新特性可能有所不同。建议在生产环境中参考官方最新文档。