Redis列表管理:高效存储与操作指南

引言

Redis是一个开源的、基于内存的键值对数据存储系统。在Redis中,列表是一组按照插入顺序排序的字符串集合,其结构类似于链表。本教程将详细介绍如何在Redis中创建和使用列表元素。

如何使用本指南

本指南以备忘录形式编写,并附带丰富的示例。我们鼓励您直接跳转到与您当前任务相关的部分。

本指南中展示的命令已在运行Redis版本6.0.16的Ubuntu 22.04服务器上进行测试。要设置类似的环境,您可以参考我们的指南《如何在Ubuntu 22.04上安装和保护Redis》中的步骤1。我们将通过使用Redis命令行界面redis-cli来运行这些命令,并展示其行为。如果您使用不同的Redis界面,例如Redli,某些命令的精确输出可能会有所不同。

或者,您也可以使用托管的Redis数据库实例来测试这些命令。但请注意,根据您的数据库提供商所允许的控制级别,本指南中的某些命令可能无法按预期工作。要获取Silicon Cloud托管数据库,请参考我们的托管数据库产品文档。接下来,您必须安装Redli或设置TLS隧道,以便通过TLS连接到托管数据库。

创建列表

一个键只能持有一个列表,但任何列表都可以容纳超过40亿个元素。Redis从左到右读取列表。您可以使用LPUSH命令将新的列表元素添加到列表的头部(即“左”端),或使用RPUSH将其添加到尾部(即“右”端)。您还可以使用LPUSHRPUSH来创建一个新的列表。

LPUSH <key> <value>

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


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开始的索引,表示0代表列表中的第一个元素,1代表下一个元素,以此类推。

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

127.0.0.1:6379> LRANGE key_philosophy1 0 7

这是文章《如何在Redis中管理列表》的第2部分(共3部分)。

1) "我" 2) "思故" 3) "我在" 4) "笛卡尔" 5) "如是说"

lrange 接收的偏移量也可以是负数。在这种情况下,-1 代表列表的最后一个元素,-2 代表列表的倒数第二个元素,依此类推。以下示例返回 key_philosophy1 列表中的最后三个元素。

  1. lrange key_philosophy1 -3 -1
输出

1) "我" 2) "在" 3) "如是说"

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

  1. lindex key_philosophy1 4
输出

"在"

要找出给定列表中有多少元素,可以使用 llen 命令,该命令是“列表长度”(list length)的缩写。

  1. llen key_philosophy1
输出

(integer) 8

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

从列表中删除元素

lrem 命令会删除与给定值匹配的指定数量的第一个出现项。为了进行实验,请创建以下列表:

  1. rpush key_Bond "永不" "说" "永不" "再" "你" "只" "活" "两次" "生" "死" "关头" "明日" "永" "不" "死"

以下的 lrem 示例会删除第一个出现的值 "活"。

  1. lrem key_Bond 1 "活"

这个命令将输出从列表中删除的元素数量。

输出

(integer) 1

传递给 lrem 命令的数字也可以是负数。以下例子将删除值为 "永不" 的最后两个出现次数。

  1. lrem key_Bond -2 "永不"
输出

(integer) 2

lpop 命令将列表中的第一个或“最左边”的元素移除并返回。

  1. lpop key_Bond
输出

"永不"

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

  1. rpop key_Bond
输出

"死"

Redis 还包含 rpoplpush 命令,该命令可以将一个列表的最后一个元素移除,并将其推送到另一个列表的开头。

  1. rpoplpush key_Bond key_AfterToday
输出

这是文章《如何在Redis中管理列表》的第3部分(共3部分)。

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

结论

这份指南详细介绍了一些在Redis中用于创建和管理列表的命令。如果您有关于其他相关命令、参数或步骤的需求,或者想在评论中提出建议,请随时提问或留言。

关于Redis命令的更多信息,请查阅我们的教程系列《如何管理Redis数据库》。

bannerAds