如何在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将其添加到尾部(即“右”端)。您还可以使用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”
最后一个命令的输出将显示为:
(integer) 5
请注意,您可以使用一个lpush或rpush语句将多个列表元素添加到列表中。
- rpush key_philosophy1 “-“ “Rene” “Decartes”
lpushx和rpushx命令也用于向列表中添加元素,但只有在给定列表已经存在的情况下才会起作用。如果任一命令失败,它将返回(整数) 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转换为列表,您需要删除该键,并使用lpush或rpush命令重新开始。
从列表中检索元素
要检索列表中的一系列项目,请使用lrange命令,接着是起始偏移量和终止偏移量。每个偏移量都是从0开始的索引,表示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_philophy1列表中的最后三个元素。
- lrange key_philosophy1 -3 -1
1) “I” 2) “am” 3) “sayeth”
要从列表中检索单个元素,可以使用lindex命令。然而,这个命令需要你提供元素的索引作为参数。与lrange一样,索引是从零开始的,意味着第一个元素的索引是0,第二个元素的索引是1,以此类推。
- lindex key_philosophy1 4
“am”
要找出给定列表中有多少元素,可以使用llen命令,该命令是“列表长度”的缩写。
- 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数据库》。