(书)如何管理redis数据库-6.如何在Redis中管理列表

介绍

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

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

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

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

建立清单

一个键只能包含一个列表,尽管任何列表都可以包含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" 

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

Output

(integer) 5 

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

* rpush key_philosophy1 "-" "Rene" "Decartes" 

lpushxrpushx命令也用于元素添加到列表中,但如果给定的名单已经存在只会工作。如果任何一个命令失败,它将返回(integer) 0

  * rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "–" "Aristotle" 


Output

(integer) 0 

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

* lset key_philosophy1 5 "sayeth" 

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

  * set key_philosophy3 "What is love?" 
  * lpush key_philosophy3 "Baby don't hurt me" 


Output

(error) WRONGTYPE Operation against a key holding the wrong kind of value 

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

从列表中检索元素

要检索列表中的项目范围,请使用lrange命令,后跟起始偏移量和终止偏移量。每个偏移量都是从零开始的索引,0表示代表列表中的第一个元素,1代表下一个,依此类推。

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

  * lrange key_philosophy1 0 7 


Output

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 


Output

1) "I" 2) "am" 3) "sayeth" 

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

  * lindex key_philosophy1 4 


Output

"am" 

要查找给定列表中有多少个元素,请使用llen命令,该命令是“ l ist len gth”的缩写:

  * llen key_philosophy1 


Output

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

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

Output

(integer) 1 

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

  * lrem key_Bond -2 "Never" 


Output

(integer) 2 

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

  * lpop key_Bond 


Output

"Never" 

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

  * rpop key_Bond 


Output

"Dies" 

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

  * rpoplpush key_Bond key_AfterToday 


Output

"Tomorrow" 

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

结论

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