如何在 Redis 中管理列表

介绍

Redis是一个开源的,内存中的关键值数据存储。在Redis中,一个 list是按插入顺序排序的字符串的集合,类似于链接列表。

如何使用此指南

这个指南是写成一个骗局的表,包含自含的示例,我们鼓励你跳到任何与你试图完成的任务相关的部分。

在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1 在 How To Install and Secure Redis on Ubuntu 22.04 上进行测试。 我们将通过使用 Redis 命令行接口的 redis-cli 来演示这些命令的行为。 如果您使用不同的 Redis 接口 - 例如 - 某些命令的准确输出可能会有所不同。

或者,您可以提供一个受管理的 Redis 数据库实例来测试这些命令,但根据数据库提供商允许的控制级别,本指南中的一些命令可能无法按描述的方式工作。 要提供 DigitalOcean 受管理数据库,请遵循我们的 管理数据库产品文档。

创建列表

一个键只能包含一个列表,但任何列表都可以包含超过四十亿个元素。Redis从左到右读取列表,您可以使用lpush命令将新列表元素添加到列表的头部(左端)或rpush命令的尾巴(右端)。

1lpush key value

两个命令都输出一个整数,显示列表中有多少个元素。

1lpush key_philosophy1 "therefore"
2lpush key_philosophy1 "think"
3rpush key_philosophy1 "I"
4lpush key_philosophy1 "I"
5rpush key_philosophy1 "am"

最后一个命令的输出将读到:

1[secondary_label Output]
2(integer) 5

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

1rpush key_philosophy1 "-" "Rene" "Decartes"

lpushx和rpushx命令也被用来添加元素到列表中,但只有在给定的列表已经存在时才会起作用。

1rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "-" "Aristotle"
1[secondary_label Output]
2(integer) 0

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

1lset key_philosophy1 5 "sayeth"

如果您尝试将列表元素添加到不包含列表的现有密钥中,则会导致数据类型的碰撞并返回错误,例如,下面的设置命令会创建包含字符串的密钥,因此下面的尝试用推添加列表元素将失败:

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

无法将 Redis 密钥从一个数据类型转换为另一个数据类型,因此要将 key_philosophy3 转换为列表,您需要删除密钥并重新开始使用 lpush 或 rpush 命令。

从列表中获取元素

若要在列表中查找一系列项目,请使用lange命令,然后是 start offset和 stop offset. 每个 offset 都是基于零的索引,这意味着0代表列表中的第一个元素,1代表下一个元素,等等。

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

1lrange key_philosophy1 0 7
1[secondary_label Output]
21) "I"
32) "think"
43) "therefore"
54) "I"
65) "am"
76) "sayeth"
87) "Rene"
98) "Decartes"

在这种情况下,1表示列表中的最后元素,2表示列表中的第二到最后元素,等等。

1lrange key_philosophy1 -3 -1
1[secondary_label Output]
21) "I"
32) "am"
43) "sayeth"

若要从列表中获取单个元素,可以使用lindex命令. 但是,这个命令要求你作为参数提供元素的索引. 与lrange一样,索引是基于零的,这意味着第一个元素在索引0,第二个元素在索引1,等等:

1lindex key_philosophy1 4
1[secondary_label Output]
2"am"

要找出某一列表中有多少元素,请使用llen命令,该命令是**l**ist **len**gth的缩写:

1llen key_philosophy1
1[secondary_label Output]
2(integer) 8

如果存储在给定的密钥中的值不存在,则llen将返回错误。

从列表中删除项目

lrem命令删除与给定值相匹配的特定事件数量中的第一个,然后创建以下列表:

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

以下lrem示例将删除值Live的第一个发生:

1lrem key_Bond 1 "Live"

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

1[secondary_label Output]
2(integer) 1

传递给lrem命令的数目也可能为负数,下面的示例会删除值Never的最后两次发生:

1lrem key_Bond -2 "Never"
1[secondary_label Output]
2(integer) 2

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

1lpop key_Bond
1[secondary_label Output]
2"Never"

同样,要从列表中删除并返回最后一个或最正确的元素,请使用rpop:

1rpop key_Bond
1[secondary_label Output]
2"Dies"

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

1rpoplpush key_Bond key_AfterToday
1[secondary_label Output]
2"Tomorrow"

如果rpoplpush命令中传输的源密钥和目标密钥是相同的,它基本上会旋转列表中的元素。

结论

本指南详细介绍了一些可以用于在 Redis 中创建和管理列表的命令. 如果在本指南中您想要了解的其他相关命令、论点或程序,请在评论中询问或提出建议。

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

Published At
Categories with 技术
comments powered by Disqus