如何在 Redis 中管理列表

介绍

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

如何使用此指南

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

在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1How 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

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

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

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

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 转换为列表,您需要删除密钥并重新开始使用 lpushrpush 命令。

从列表中获取元素

若要在列表中查找一系列项目,请使用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