俊瑶先森


  • 首页

  • 归档

  • 关于

(书)如何管理redis数据库-13.如何从命令行更改Redis的配置

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。Redis有几个命令,可让您即时更改Redis服务器的配置设置。本教程将介绍其中一些命令,并说明如何使这些配置更改永久生效。

如何使用本指南

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

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

请注意,托管Redis数据库通常不允许用户更改配置文件。如果您正在使用DigitalOcean的托管数据库,则本指南中概述的命令将导致错误。

更改Redis的配置

本节中概述的命令仅会在当前会话期间或直到您运行之前更改Redis服务器的行为,config rewrite以使其永久不变。您可以通过使用首选文本编辑器打开和编辑Redis配置文件来直接更改它。例如,您可以nano这样做:

* sudo nano /etc/redis/redis.conf 

警告:该config set命令被认为是危险的。通过更改Redis配置文件,有可能导致Redis服务器以意外或不良方式运行。我们建议您仅在config set测试命令的行为时运行命令,或者绝对确定要对Redis配置进行更改。

您可能会希望将此命令重命名为偶然运行的可能性较低的名称。

config set允许您在运行时重新配置Redis,而无需重新启动服务。它使用以下语法:

* config set parameter value 

例如,如果要更改运行save命令后Redis将产生的数据库转储文件的名称,则可以运行如下命令:

* config set "dbfilename" "new_file.rdb" 

如果配置更改有效,则命令将返回OK。否则将返回错误。

注意:并非redis.conf文件中的每个参数都可以通过config set操作来更改。例如,您不能更改requirepass参数定义的身份验证密码。

永久进行配置更改

config set不会永久更改Redis实例的配置文件;它仅在运行时更改Redis的行为。要redis.conf在运行config-set命令后进行编辑并使当前会话的配置永久化,请运行config rewrite:

* config rewrite 

该命令将尽最大努力保留原始redis.conf文件的注释和整体结构,而只需进行最小的更改即可匹配服务器当前使用的设置。

就像config set,如果重写成功config rewrite将返回OK。

检查Redis的配置

要读取Redis服务器的当前配置参数,请运行config get命令。config get只有一个参数,其可以是在使用的参数中的任一个完全匹配redis.conf或水珠图案。例如:

* config get repl* 

根据您的Redis配置,此命令可能返回:

Output

 1) "repl-ping-slave-period" 2) "10" 3) "repl-timeout" 4) "60" 5) "repl-backlog-size" 6) "1048576" 7) "repl-backlog-ttl" 8) "3600" 9) "repl-diskless-sync-delay" 10) "5" 11) "repl-disable-tcp-nodelay" 12) "no" 13) "repl-diskless-sync" 14) "no" 

您还可以config set通过运行返回所有支持的配置参数config get *。

结论

本指南详细介绍了redis-cli用于动态更改Redis服务器的配置文件的命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的评论中提出疑问或提出建议。

(书)如何管理redis数据库-12.如何解决Redis中的问题

发表于 2020-11-28

介绍

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连接到托管数据库。

对内存相关问题进行故障排除

memory usage告诉您单个键当前正在使用多少内存。它以键的名称作为参数,并输出其使用的字节数:

  * memory usage key_meaningOfLife 

Output

(integer) 42 

为了更全面地了解您的Redis服务器如何使用内存,可以运行以下memory stats命令:

* memory stats 

此命令输出与内存相关的指标及其值的数组。以下是报告的指标memory stats:

  • peak.allocated:Redis消耗的最大字节数
  • total.allocated:Redis分配的总字节数
  • startup.allocated:Redis在启动时消耗的初始字节数
  • `replication.backlog积压的大小,以字节为单位
  • clients.slaves:所有副本_开销_的总大小(输出和查询缓冲区以及连接上下文)
  • clients.normal:所有客户端开销的总大小
  • aof.buffer:当前和重写的仅附加文件缓冲区的总大小
  • db.0:服务器上正在使用的每个数据库的主要和到期字典的开销,以字节为单位报告
  • overhead.total:用于管理Redis密钥空间的所有开销的总和
  • keys.count:服务器上所有数据库中存储的密钥总数
  • keys.bytes-per-key:服务器的净内存使用率与 keys.count
  • dataset.bytes:数据集的大小,以字节为单位
  • dataset.percentage:Redis占用的Redis净内存使用量的百分比 dataset.bytes
  • peak.percentage:peak.allocated取出的百分比total.allocated
  • fragmentation:当前正在使用的内存量除以Redis实际使用的物理内存之比

memory malloc-stats提供了jemalloc的内部统计报告,该报告是Linux系统上Redis使用的内存分配器:

* memory malloc-stats 

如果您似乎遇到了与内存有关的问题,但是解析前面命令的输出证明是无济于事的,则可以尝试运行memory doctor:

* memory doctor 

此功能将输出所有可以发现的内存消耗问题,并提出潜在的解决方案。

获取有关Redis实例的常规信息

与内存管理没有直接关系的调试命令是monitor。此命令使您可以查看Redis服务器处理的每个命令的恒定流:

  * monitor 

Output

OK 1566157213.896437 [0 127.0.0.1:47740] "auth" "foobared" 1566157215.870306 [0 127.0.0.1:47740] "set" "key_1" "878" 

另一个对调试有用的命令是info,它返回有关服务器的多个信息和统计信息块:

  * info 

Output

# Server redis_version:4.0.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:9435c3c2879311f3 redis_mode:standalone os:Linux 4.15.0-52-generic x86_64 . . . 

此命令返回很多信息。如果您只想查看一个信息块,则可以将其指定为info:

  * info CPU 

Output

# CPU used_cpu_sys:173.16 used_cpu_user:70.89 used_cpu_sys_children:0.01 used_cpu_user_children:0.04 

请注意,该info命令返回的信息将取决于您所使用的Redis版本。

使用keys命令

keys如果您忘记了某个键的名称,或者您已经创建了一个键,但又意外误拼了它的名称,则该命令很有用。keys查找与模式匹配的键:

* keys pattern 

支持以下glob样式的变量

  • ?是通配符站在任何单个字符,这样s?mmy的比赛sammy,sommy和sqmmy
  • *是一个通配符,用来代表任何数量的字符,包括没有任何字符,所以sa*y比赛sammy,say,sammmmmmy,和salmony
  • 您可以通过将模式将其括在方括号中来指定模式可以包含的两个或多个字符,以便s[ai]mmy匹配sammy和simmy,但不能匹配summy
  • 要设置一个忽略一个或多个字母的通配符,请将其括在方括号中,并在其前面加上一个胡萝卜(^),这样s[^oi]mmy可以匹配sammy和sxmmy,但不能匹配sommy或simmy
  • 要设置一个通配符,其中包括一系列的字母,范围的开头和结尾分开连字符和括号包起来,这样s[a-o]mmy将匹配sammy,skmmy和sommy,但不srmmy

警告:本Redis的文件警告说,keys应该几乎从来没有在生产环境中使用,因为它可能会对性能产生重大的负面影响。

结论

本指南详细介绍了许多命令,这些命令可用于故障排除和解决与Redis一起使用时可能遇到的问题。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。

(书)如何管理redis数据库-11.如何使Redis中的密钥过期

发表于 2020-11-28

介绍

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连接到托管数据库。

设置密钥过期

您可以使用expire命令设置现有密钥的到期时间,该命令将密钥的名称和到期前的秒数作为参数。为了证明这一点,请运行以下两个命令。第一创建名为字符串键key_melon具有值"cantaloupe",而第二组它到450秒之后超时:

* set key_melon "cantaloupe" 
* expire key_melon 450 

如果成功设置了超时,则expire命令将返回(integer) 1。如果设置超时失败,它将返回(integer) 0。

或者,您可以使用该expireat命令将密钥设置为在特定的时间点到期。它使用Unix时间戳作为参数,而不是到期前的秒数。Unix时间戳是自1970年1月1日_Unix纪元_或00:00:00 UTC以来的秒数。可以使用许多在线工具来查找特定日期和时间的Unix时间戳,例如EpochConverter或UnixTimestamp.com。

例如,要设置key_melon为在2025年5月1日格林尼治标准时间晚上8:30到期(由Unix timestamp表示1746131400),可以使用以下命令:

* expireat key_melon 1746131400 

请注意,如果传递给您的时间戳expireat已经发生,它将立即删除密钥。

检查密钥过期的时间

你设置一键到期任何时候,你可以检查剩余到期为止(以秒为单位)的时候ttl,它的全称是“牛逼IME牛逼Ø升香港专业教育学院”:

  * ttl key_melon 

Output

(integer) 433 

有关更详细的信息,可以运行pttl,它将返回直到密钥过期的时间(以毫秒为单位):

  * pttl key_melon 

Output

(integer) 431506 

如果密钥尚未设置为过期且密钥不存在,则两者ttl和pttl都将返回。(integer) -1``(integer) -2

持久键

如果密钥已设置为过期,则任何覆盖密钥内容的命令(例如set或getset)都会清除密钥的超时值。要手动清除键的超时,请使用以下persist命令:

* persist key_melon 

如果成功完成,该persist命令将返回(integer) 1,表明密钥将不再过期。

结论

本指南详细介绍了用于在Redis中操作和检查键持久性的许多命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。

(书)如何管理redis数据库-10.如何在Redis中运行事务

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。Redis允许您计划一系列命令,然后一个接一个地运行它们,这一过程称为_transaction_。每个事务都被视为不间断且隔离的操作,以确保数据完整性。在执行事务块时,客户端无法运行命令

本教程介绍了如何执行和取消交易,还包括一些与交易通常相关的陷阱的信息。

如何使用本指南

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

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

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

进行交易

该multi命令告诉Redis开始事务块。在运行exec命令之前,所有后续命令都将排队等待执行。

以下命令形成一个事务块。第一个命令启动事务,第二个命令设置一个包含值的字符串的键1,第三个命令将值增加1,第四个命令将其值增加40,第五个命令返回字符串的当前值,最后一个返回执行事务块:

* multi 
* set key_MeaningOfLife 1 
* incr key_MeaningOfLife 
* incrby key_MeaningOfLife 40 
* get key_MeaningOfLife 
* exec 

运行后multi,redis-cli将使用响应以下每个命令QUEUED。运行exec命令后,它将分别显示每个命令的输出:

Output

1) OK 2) (integer) 2 3) (integer) 42 4) "42" 

事务块中包含的命令按排队顺序依次运行。Redis事务是_原子的_,这意味着要么处理事务块中的每个命令(意味着它被视为有效并排队等待执行),要么不执行。但是,即使命令成功排队,执行时它仍然可能产生错误。在这种情况下,事务中的其他命令仍然可以运行,但是Redis将跳过导致错误的命令。有关更多详细信息,请参见了解事务错误的部分。

取消交易

要取消交易,请运行discard命令。这样可以防止任何先前排队的命令运行:

  * multi 
  * set key_A 146 
  * incrby key_A 10 
  * discard 


Output

OK 

该discard命令将连接返回到正常状态,该状态告诉Redis像往常一样运行单个命令。您需要multi再次运行以告知服务器您正在开始另一笔交易。

了解交易错误

某些命令可能无法排队,例如语法错误的命令。如果尝试对语法错误的命令进行排队,则Redis将返回错误。

以下事务创建了一个名为的键key_A,然后尝试将其增加10。但是,该incrby命令中的拼写错误会导致并出错并关闭该事务:

  * multi 
  * set key_A 146 
  * incrbuy key_A 10 


Output

(error) ERR unknown command 'incrbuy' 

如果exec在尝试将命令与类似语法错误的命令放入队列后尝试运行命令,则会收到另一条错误消息,告知您事务已被丢弃:

  * exec 


Output

(error) EXECABORT Transaction discarded because of previous errors. 

在这种情况下,您需要重新启动事务块并确保正确输入每个命令。

一些不可能命令是可能的队列,例如运行incr在仅包含字符串的密钥。由于该命令在语法上是正确的,因此,如果您尝试将其包含在事务中,则Redis不会返回错误,也不会阻止您运行exec。在这种情况下,将执行队列中的所有其他命令,但不可能的命令将返回错误:

  * multi 
  * set key_A 146 
  * incrby key_A "ten" 
  * exec 


Output

1) OK 2) (error) ERR value is not an integer or out of range 

有关Redis如何处理事务中的错误的更多信息,请参阅关于此主题的官方文档。

结论

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

(书)如何管理redis数据库-9.如何在Redis中管理排序集

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。在Redis的,排序集合类似于一个数据类型集在这两者都是串的非重复的组。不同之处在于,已排序集中的每个成员都与一个分数相关联,从而可以从最小分数到最大分数进行排序。与集合一样,已排序集合中的每个成员都必须是唯一的,尽管多个成员可以共享同一分数。

本教程说明了如何创建排序集,检索和删除其成员以及如何从现有集合中创建新的排序集。

如何使用本指南

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

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

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

创建排序集并添加成员

要创建排序集,请使用zadd命令。zadd接受将保留排序后的键集的键的名称作为参数,后跟要添加的成员的分数和成员本身的值。以下命令将创建一个排序的集合密钥,该集合密钥的faveGuitarists一个成员名为,"Joe Pass"得分为1:

* zadd faveGuitarists 1 "Joe Pass" 

zadd 将返回一个整数,该整数指示如果已成功创建排序集,则将多少个成员添加到排序集中。

Output

(integer) 1 

您可以使用将多个成员添加到排序集中zadd。请注意,他们的分数不必是连续的,分数之间可以有间隔,并且相同排序集中的多个成员可以共享相同的分数:

  * zadd faveGuitarists 4 "Stephen Malkmus" 2 "Rosetta Tharpe" 3 "Bola Sete" 3 "Doug Martsch" 8 "Elizabeth Cotten" 12 "Nancy Wilson" 4 "Memphis Minnie" 12 "Michael Houser" 

Output

(integer) 8 

zadd 可以接受以下选项,您必须在密钥名称之后和第一个成员评分之前输入以下选项:

  • NX或XX:这些选项具有相反的效果,因此您在任何zadd操作中都只能包括其中之一:
    • NX:告诉zadd 不更新现有成员。使用此选项,zadd将仅添加新元素。
    • XX:告诉zadd给只更新现有的元素。使用此选项,zadd将永远不会添加新成员。
  • CH:通常,zadd仅返回添加到排序集中的新元素的数量。但是,使用此选项时,zadd将返回_更改后的_元素个数。这包括新添加的成员和分数已更改的成员。
  • INCR:这会使命令增加成员的得分值。如果该成员还不存在,则该命令会将其添加到已排序的集合中,并将其增量作为分数,就像其原始分数是一样0。有了INCR,zadd将成功返回成员的新分数。请注意,使用此选项时,一次只能包含一个分数/成员对。

无需将INCR选项传递给zadd,您可以使用zincrby行为完全相同的命令。而不是给排序后的集合成员一个分数值所表示的值,例如zadd,它使该成员的分数增加该值。例如,以下命令将"Stephen Malkmus"原来是该成员的得分4提高5到9。

  * zincrby faveGuitarists 5 "Stephen Malkmus" 

Output

"9" 

与zadd命令INCR选项的情况一样,如果指定的成员不存在,则将zincrby使用增量值作为其得分来创建它。

从排序集中检索成员

检索排序集中的成员的最基本方法是使用zrange命令。此命令接受要检索其成员的键的名称以及其中包含的成员范围作为参数。该范围由两个数字定义,这些数字表示从零开始的索引,0表示代表排序集中的第一个成员(或得分最低的成员),1代表下一个,依此类推。

下面的示例将返回faveGuitarists上一部分中创建的排序集中的前四个成员:

  * zrange faveGuitarists 0 3 

Output

1) "Joe Pass" 2) "Rosetta Tharpe" 3) "Bola Sete" 4) "Doug Martsch" 

请注意,如果传递给的排序集zrange具有两个或多个共享相同分数的元素,它将按照_字典顺序_或字母顺序对这些元素进行排序。

开始索引和停止索引也可以是负数,-1代表最后一个成员,-2代表倒数第二个,依此类推:

  * zrange faveGuitarists -5 -2 

Output

1) "Memphis Minnie" 2) "Elizabeth Cotten" 3) "Stephen Malkmus" 4) "Michael Houser" 

zrange可以接受WITHSCORES参数,当包含该参数时,该参数还将返回成员的分数:

  * zrange faveGuitarists 5 6 WITHSCORES 

Output

1) "Elizabeth Cotten" 2) "8" 3) "Stephen Malkmus" 4) "9" 

zrange只能以数字升序返回一系列成员。要反转它并以降序返回范围,必须使用zrevrange命令。可以将此命令视为暂时反转给定排序集的顺序,然后返回属于指定范围内的成员。因此,使用zrevrange,0将代表密钥中持有的最后一个成员,1将代表倒数第二个,等等:

  * zrevrange faveGuitarists 0 5 

Output

1) "Nancy Wilson" 2) "Michael Houser" 3) "Stephen Malkmus" 4) "Elizabeth Cotten" 5) "Memphis Minnie" 6) "Doug Martsch" 

zrevrange也可以接受该WITHSCORES选项。

您可以使用zrangebyscore命令根据其分数返回一系列成员。在下面的示例中,该命令将返回faveGuitarists键中分数为2、3或4的任何成员:

  * zrangebyscore faveGuitarists 2 4 

Output

1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 4) "Memphis Minnie" 

在此示例中,范围是包含端值的,这意味着它将返回得分为2或4的成员。您可以在范围的任一端都加上开放括号((),以排除范围的任何一端。以下示例将返回分数大于或等于2,但小于的每个成员4:

  * zrangebyscore faveGuitarists 2 (4 

Output

1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 

与一样zrange,zrangebyscore可以接受WITHSCORES参数。它还接受该LIMIT选项,您可以使用该选项仅从zrangebyscore输出中检索元素的选择。该选项接受一个offset(偏移量)和一个count(计数),该偏移量标记该命令将返回的范围内的第一个成员,该计数总共定义该命令将返回的成员数。例如,以下命令将查看已faveGuitarists排序集合的前六个成员,但仅从该集合中返回3个成员,从该范围内的第二个成员开始,由表示1:

  * zrangebyscore faveGuitarists 0 5 LIMIT 1 3 

Output

1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 

该zrevrangebyscore命令根据成员的得分返回相反的范围。以下命令将返回分数在10到6之间的集合中的每个成员:

  * zrevrangebyscore faveGuitarists 10 6 

Output

1) "Stephen Malkmus" 2) "Elizabeth Cotten" 

与一样zrangebyscore,zrevrangebyscore可以接受WITHSCORES和LIMIT选项。此外,您可以在范围的任一末端加上一个开放的括号,以排除该末端。

有时,排序集中的所有成员都具有相同的分数。在这种情况下,您可以使用命令强制redis返回按_字典顺序_或字母顺序排序的元素范围zrangebylex。要尝试此命令,请运行以下zadd命令以创建一个排序集,其中每个成员的得分均相同:

* zadd SomervilleSquares 0 Davis 0 Inman 0 Union 0 porter 0 magoun 0 ball 0 assembly 

zrangebylex后面必须跟一个键的名称,一个开始间隔和一个停止间隔。开始和停止时间间隔必须以圆括号(()或方括号()开头[,如下所示:

  * zrangebylex SomervilleSquares [a [z 

Output

1) "assembly" 2) "ball" 3) "magoun" 4) "porter" 

请注意,即使该命令查找的范围是从a到,该示例也仅返回集合中八个成员中的四个z。这是因为Redis值区分大小写,因此以大写字母开头的成员将从其输出中排除。要返回这些值,可以运行以下命令:

  * zrangebylex SomervilleSquares [A [z 

Output

1) "Davis" 2) "Inman" 3) "Union" 4) "assembly" 5) "ball" 6) "magoun" 7) "porter" 

zrangebylex也接受特殊字符-,它们代表负无穷大,而+代表正无穷大。因此,以下命令语法还将返回排序集中的每个成员:

* zrangebylex SomervilleSquares - + 

请注意,zrangebylex不能以相反的字典顺序(字母升序)返回排序的集合成员。为此,请使用zrevrangebylex:

  * zrevrangebylex SomervilleSquares + - 

Output

1) "porter" 2) "magoun" 3) "ball" 4) "assembly" 5) "Union" 6) "Inman" 7) "Davis" 

因为它适用于每个成员都具有相同分数的排序集,zrangebylex所以不接受该WITHSCORES选项。但是,它确实接受该LIMIT选项。

检索有关排序集的信息

要查找给定排序集中有多少个成员(或者换句话说,确定其基数),请使用zcard命令。以下示例显示了faveGuitarists本指南第一部分中密钥中拥有多少成员:

  * zcard faveGuitarists 

Output

(integer) 9 

zcount可以告诉您在给定的排序集中包含多少个分数范围内的元素。键后的第一个数字是范围的开始,第二个数字是范围的结束:

  * zcount faveGuitarists 3 8 

Output

(integer) 4 

zscore 输出排序集中指定成员的分数:

  * zscore faveGuitarists "Bola Sete" 

Output

"3" 

如果指定的成员或密钥都不存在,zscore将返回(nil)。

zrank与相似zscore,但不返回给定成员的分数,而是返回其排名。在Redis中,_等级_是排序集中成员的从零开始的索引,按其得分排序。例如,"Joe Pass"得分为1,但由于这是键中所有成员的最低得分,因此其等级为0:

  * zrank faveGuitarists "Joe Pass" 

Output

(integer) 0 

调用了另一个Redis命令zrevrank,该命令执行与相同的功能zrank,但取而代之的是反转集合中成员的等级。在以下示例中,该成员"Joe Pass"的得分最低,因此其反向排名最高:

  * zrevrank faveGuitarists "Joe Pass" 

Output

(integer) 8 

成员的分数与其等级之间的唯一关系是其分数相对于其他成员的分数所在的位置。如果两个连续成员之间存在得分差距,则该得分差距不会反映在他们的排名中。请注意,如果两个成员的分数相同,则按字母顺序排在第一位的成员将具有较低的排名。

类似于zscore,如果键或成员不存在zrank,zrevrank将返回(nil)。

zlexcount可以告诉您在词典范围之间的排序集中有多少个成员。下面的示例使用SomervilleSquares上一节中的排序集:

  * zlexcount SomervilleSquares [M [t 

Output

(integer) 5 

该命令的语法与zrangebylex命令的语法相同,因此有关如何定义字符串范围的详细信息,请参考上一节。

从排序集中删除成员

该zrem命令可以从排序集中删除一个或多个成员:

* zrem faveGuitarists "Doug Martsch" "Bola Sete" 

zrem 将返回一个整数,指示从排序集中删除了多少个成员:

Output

(integer) 2 

有三个Redis命令,可让您根据范围删除排序集的成员。例如,如果排序集中的每个成员都具有相同的分数,则可以使用来根据词典范围删除成员zremrangebylex。该命令使用与相同的语法zrangebylex。以下示例将从SomervilleSquares上一部分中创建的键中删除所有以大写字母开头的成员:

* zremrangebylex SomervilleSquares [A [Z 

zremrangebylex 将输出一个整数,指示已删除的成员数:

Output

(integer) 3 

您还可以zremrangebyscore使用命令使用与命令相同的语法,根据分数范围删除成员zrangebyscore。以下示例将删除每个faveGuitarists得分为4、5或6的成员:

  * zremrangebyscore faveGuitarists 4 6 

Output

(integer) 1 

您可以从基于一系列与队伍的一组删除成员zremrangebyrank的命令,它使用相同的语法zrangebyrank。以下命令将删除排名最低的排序集中的三个成员,这些成员由一系列从零开始的索引定义:

  * zremrangebyrank faveGuitarists 0 2 

Output

(integer) 3 

请注意,传递给的数字remrangebyrank也可以为负,-1代表最高排名,次高排名,-2依此类推。

从现有集合创建新的排序集合

Redis包括两个命令,它们允许您比较多个排序集的成员并基于这些比较创建新的:zinterstore和zunionstore。要试验这些命令,请运行以下zadd命令以创建一些示例排序集。

* zadd NewKids 1 "Jonathan" 2 "Jordan" 3 "Joey" 4 "Donnie" 5 "Danny" 
* zadd Nsync 1 "Justin" 2 "Chris" 3 "Joey" 4 "Lance" 5 "JC" 

zinterstore查找两个或多个排序集(它们的交集)共享的成员,并生成仅包含那些成员的新排序集。此命令必须依次包含相交成员将作为排序集存储的目标键的名称,要传递给的键的数量以及zinterstore要分析的键的名称:

* zinterstore BoyBands 2 NewKids Nsync 

zinterstore将返回一个整数,该整数显示存储到目标排序集中的元素数。因为NewKids且Nsync仅共享一个成员"Joey",所以该命令将返回1:

Output

(integer) 1 

请注意,如果目标键已经存在,zinterstore将覆盖其内容。

zunionstore将创建一个新的排序集,其中包含传递给它的每个键成员。此命令使用与相同的语法zinterstore,并且需要目标键的名称,传递给该命令的键的数量以及键的名称:

* zunionstore SuperGroup 2 NewKids Nsync 

像一样zinterstore,zunionstore将返回一个整数,显示存储在目标键中的元素数。即使两个原始排序集都包含五个成员,但由于排序集不能具有重复成员,并且每个键都有一个名为"Joey"的成员,因此所得的整数将为9:

Output

(integer) 9 

与一样zinterstore,zunionstore如果目标键已经存在,它将覆盖目标键的内容。

为了在使用zinterstore和创建新的排序集时更好地控制成员分数zunionstore,这两个命令都接受WEIGHTS和AGGREGATE选项。

对于WEIGHTS该命令中包含的每个排序集,该选项后均带有一个数字,该数字_加权_或乘以每个成员的分数。WEIGHTS选项之后的第一个数字对传递给命令的第一个键的分数加权,第二个数字对第二个键的加权加权,依此类推。

以下示例创建一个新的排序集,其中包含来自NewKids和Nsync排序集的相交键。它将NewKids密钥中的分数加权三倍,并将密钥中的分数加权Nsync七倍:

* zinterstore BoyBandsWeighted 2 NewKids Nsync WEIGHTS 3 7 

如果WEIGHTS选项未包括在内,权重默认为1两个zinterstore和zunionstore。

AGGREGATE接受三个子选项。其中的第一个通过添加组合集中匹配成员的得分来SUM实现zinterstore和zunionstore的默认行为。

如果在共享一个成员的两个排序集合上运行zinterstore或zunionstore运算,但是该成员在每个集合中具有不同的分数,则可以使用MIN子选项强制操作为新集合中的两个分数中的较低者赋值。

* zinterstore BoyBandsWeightedMin 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MIN 

由于两个排序的集合只有一个具有相同分数(3)的匹配成员,因此此命令将创建一个新集合,其成员具有两个加权分数中的较低者:

  * zscore BoyBandsWeightedMin "Joey" 

Output

"9" 

同样,AGGREGATE可以使用以下选项强制zinterstore或zunionstore分配两个分数中的较高者MAX:

* zinterstore BoyBandsWeightedMax 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MAX 

此命令创建一个新集合,其中有一个成员,"Joey"具有两个加权得分中的较高者:

  * zscore BoyBandsWeightedMax "Joey" 

Output

"21" 

将其WEIGHTS视为在分析成员之前临时操纵其分数的一种方式可能会有所帮助。同样,将AGGREGATE选项视为在将成员添加到新集中之前决定如何控制其分数的一种方式也很有帮助。

结论

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

(书)如何管理redis数据库-8.如何在Redis中管理集合

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。设置在Redis的是储存在一个给定的钥匙串的集合。当保存在一个集合中时,单个记录值称为_成员_。与列表不同,集合是无序的,并且不允许重复的值。

本教程说明如何创建集合,检索和删除成员以及比较不同集合的成员。

如何使用本指南

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

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

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

创建集合

该sadd命令允许您创建一个集合并向其中添加一个或多个成员。下面的例子将创建一组在一个名为键key_horror与成员"Frankenstein"和"Godzilla":

* sadd key_horror "Frankenstein" "Godzilla" 

如果成功,sadd将返回一个整数,显示它添加到集合中的成员数量:

Output

(integer) 2 

如果您尝试将集合的成员添加到已经拥有非集合值的键中,它将返回错误。在此块中的第一个命令创建一个列表命名的key_action一个元素,"Shaft"。下一条命令尝试将set成员添加"Shane"到列表中,但是由于数据类型冲突而产生错误:

  * rpush key_action "Shaft" 
  * sadd key_action "Shane" 

Output

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

请注意,集合不允许同一成员出现多次:

  * sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World" 

Output

(integer) 4 

即使此sadd命令指定了八个成员,它也会丢弃四个重复"Mad"成员,从而将大小设置为4。

从集合中检索成员

在本节中,我们将介绍一些Redis命令,这些命令返回有关集合中持有的成员的信息。要练习此处概述的命令,请运行以下命令,这将创建一个由六个成员组成的集合,该集合的键为key_stooges:

* sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe" 

要从集合中返回每个成员,请运行smembers命令,然后输入要检查的密钥:

  * smembers key_stooges 

Output

1) "Curly" 2) "Moe" 3) "Larry" 4) "Shemp" 5) "Curly Joe" 6) "Joe" 

要检查特定值是否是集合的成员,请使用以下sismember命令:

* sismember key_stooges "Harpo" 

如果元素"Harpo"是key_stooges集合的成员,sismember则将返回1。否则,它将返回0:

Output

(integer) 0 

要查看给定集合中有多少成员(换句话说,找到给定集合的_基数_),请运行scard:

  * scard key_stooges 

Output

(integer) 6 

要从集合中返回随机元素,请运行srandmember:

  * srandmember key_stooges 

Output

"Larry" 

要从集合中返回多个随机,不同的元素,可以在srandmember命令后加上要检索的元素数量:

  * srandmember key_stooges 3 

Output

1) "Larry" 2) "Moe" 3) "Curly Joe" 

如果您向传递一个负数srandmember,则该命令可以多次返回相同的元素:

  * srandmember key_stooges -3 

Output

1) "Shemp" 2) "Curly Joe" 3) "Curly Joe" 

srandmember尽管所使用的随机元素函数的性能在较大的数据集中有所改善,但它并不是完全随机的。有关更多详细信息,请参见命令的官方文档。

从集合中删除成员

Redis的带有用于从一组删除成员三个命令:spop,srem,和smove。

spop从中随机选择指定数量的成员并返回它们,类似于srandmember,然后从集合中删除它们。它接受包含集合的键的名称和要从集合中删除的成员数作为参数。如果您未指定数字,spop则默认为返回并删除单个值。

以下示例命令将从key_stooges上一节创建的集合中删除并返回两个随机选择的元素:

  * spop key_stooges 2 

Output

1) "Shemp" 2) "Larry" 

srem 允许您从集合中删除一个或多个特定成员,而不是随机成员:

* srem key_stooges "Joe" "Curly Joe" 

而不是返回从集合中删除的成员,而是srem返回一个整数,显示已删除的成员数:

Output

(integer) 2 

使用smove一个成员从一组移动到另一个。此命令以该顺序接受源集,目标集和要移动的成员作为参数。请注意,一次smove只能移动一位成员:

* smove key_stooges key_jambands "Moe" 

如果命令成功移动了成员,它将返回(integer) 1:

Output

(integer) 1 

如果smove失败,它将返回(integer) 0。请注意,如果目标键尚不存在,请smove在将成员移入之前创建它。

比较集

Redis还提供了许多命令来查找集合之间的差异和相似性。为了演示如何工作的,这部分将引用一个名为三套presidents,kings和beatles。如果您想亲自尝试本节中的命令,请创建这些集合并使用以下sadd命令填充它们:

* sadd presidents "George" "John" "Thomas" "James" 
* sadd kings "Edward" "Henry" "John" "James" "George" 
* sadd beatles "John" "George" "Paul" "Ringo" 

sinter比较不同的集合并返回_集合相交_或出现在每个集合中的值:

  * sinter presidents kings beatles 

Output

1) "John" 2) "George" 

sinterstore执行类似的功能,但不是返回相交成员,而是在包含这些相交成员的指定目的地创建了一个新集合。请注意,如果目的地已经存在,sinterstore将覆盖其内容:

  * sinterstore new_set presidents kings beatles 
  * smembers new_set 

Output

1) "John" 2) "George" 

sdiff返回_集合差异_—由以下每个集合的第一个指定集合的​​差异得出的成员:

  * sdiff presidents kings beatles 

Output

1) "Thomas" 

换句话说,sdiff查看第一个给定集合中的每个成员,然后将其与每个连续集合中的成员进行比较。第一组中也出现在以下组中的所有成员将被删除,并sdiff返回其余成员。可以将其视为从第一组中删除后续组的成员。

sdiffstore执行与相似的功能sdiff,但不返回集合差,而是在给定的目的地创建一个包含集合差的新集合:

  * sdiffstore new_set beatles kings presidents 
  * smembers new_set 

Output

1) "Paul" 2) "Ringo" 

像一样sinterstore,sdiffstore将覆盖目标键(如果已存在)。

sunion返回_集合union_或包含您指定的每个集合的每个成员的集合:

  * sunion presidents kings beatles 

Output

1) "Thomas" 2) "George" 3) "Paul" 4) "Henry" 5) "James" 6) "Edward" 7) "John" 8) "Ringo" 

sunion 将结果视为新集合,因为它只允许出现任何给定成员。

sunionstore 执行类似的功能,但是在给定的目的地创建一个包含集合并集的新集合,而不仅仅是返回结果:

  * sunionstore new_set presidents kings beatles 

Output

(integer) 8 

与sinterstore和一样sdiffstore,sunionstore如果目标键已经存在,它将覆盖目标键。

结论

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

(书)如何管理redis数据库-7.如何在Redis中管理哈希

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。Redis哈希是一种数据类型,表示字符串字段和字符串值之间的映射。哈希可以容纳许多字段-值对,并且设计为不占用太多空间,因此使其非常适合表示数据对象。例如,哈希可能代表一个客户,以及包括像场name,address,email,或customer_id。

本教程将介绍如何在Redis中管理哈希,从创建哈希到检索和删除哈希中保存的数据。

如何使用本指南

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

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

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

创建哈希

要创建哈希,请运行hset命令。此命令接受哈希键的名称,字段字符串和相应的值字符串作为参数:

* hset poet:Verlaine nationality French 

注意:在此示例及以下示例中,poet:Verlaine为哈希键。点,破折号和冒号通常用于使多字键和字段更具可读性。确保您的密钥遵循一致且易于阅读的格式很有帮助。

hset返回(integer) 1如果指定的字段是一个新的领域和值设置正确:

Output

(integer) 1 

但是,如果您未能包含哈希键的值,字段或名称,hset将返回错误。

另外,请注意,hset如果哈希值已经存在,它将覆盖其内容:

* hset poet:Verlaine nationality Francais 

如果该字段已经存在并且其值已成功更新,hset将返回(integer) 0:

Output

(integer) 0 

您也可以使用hsetnx将字段添加到哈希,但是只有在字段不存在时才起作用。如果指定的字段已经存在,hsetnx将不会有任何效果,并将返回(integer) 0:

  * hsetnx poet:Verlaine nationality French 


Output

(integer) 0 

要将多个字段/值对设置为一个给定的集合,请使用hmset命令,后跟相应的字段/值字符串:

* hmset poet:Verlaine born 1844 died 1896 genre Decadent 

hmset``OK成功就会返回。

从哈希中检索信息

您可以使用以下hexists命令确定给定哈希的字段是否存在:

* hexists poet:Verlaine nationality 

hexists``(integer) 1如果该字段确实存在,则返回,如果不存在则返回(integer) 0。

要返回一个字段的值,请运行以下hget命令,然后依次按哈希键和要检索其值的字段:

  * hget poet:Verlaine nationality 


Output

"Francais" 

hmget 使用相同的语法,但可以返回多个字段的值

  * hmget poet:Verlaine born died 


Output

1) "1844" 2) "1896" 

如果您传递给hget或hmget不存在的哈希,这两个命令将返回(nil):

  * hmget poet:Dickinson born died 


Output

1) (nil) 2) (nil) 

要获取特定哈希中包含的所有字段的列表,请运行以下hkeys命令:

  * hkeys poet:Verlaine 


Output

1) "nationality" 2) "born" 3) "died" 4) "genre" 

相反,运行hvals以检索散列中包含的值的列表:

  * hvals poet:Verlaine 


Output

1) "French" 2) "1844" 3) "1896" 4) "Decadent" 

要返回哈希表包含的每个字段及其关联值的列表,请运行hgetall:

  * hgetall poet:Verlaine 


Output

1) "nationality" 2) "French" 3) "born" 4) "1844" 5) "died" 6) "1896" 7) "genre" 8) "Decadent" 

您可以通过运行来查找哈希中的字段数hlen,它代表“ h ash len gth”:

  * hlen poet:Verlaine 


Output

(integer) 4 

你可以找到一个字段关联的值字符串的长度hstrlen,它的全称是“ ^ h灰海峡荷兰国际集团LEN GTH”:

  * hstrlen poet:Verlaine nationality 


Output

(integer) 8 

hlen``(integer) 0如果哈希不存在,将返回。

从哈希中删除字段

要从哈希表中删除字段,请运行hdel命令。hdel可以接受多个字段作为参数,并将返回一个整数,该整数指示从哈希中删除了多少个字段:

  * hdel poet:Verlaine born died 


Output

(integer) 2 

如果您将一个不存在的字段传递给hdel,它将忽略该字段,但删除您指定的任何其他现有字段。

结论

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

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

发表于 2020-11-28

介绍

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。您还可以使用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" 

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

Output

(integer) 5 

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

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

该lpushx和rpushx命令也用于元素添加到列表中,但如果给定的名单已经存在只会工作。如果任何一个命令失败,它将返回(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中创建和管理列表的许多命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。

(书)如何管理redis数据库-5.如何在Redis中管理字符串

发表于 2020-11-28

介绍

Redis是一个开源的内存中键值数据存储。在Redis中,字符串是您可以创建和管理的最基本的值类型。本教程概述了如何创建和检索字符串以及如何操作字符串键所保存的值。

如何使用本指南

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

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

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

创建和管理字符串

包含字符串的键只能包含一个值。您不能在一个键中存储多个字符串。但是,Redis中的字符串是二进制安全的,这意味着Redis字符串可以保存任何类型的数据,从字母数字字符到JPEG图像。唯一的限制是字符串的长度必须小于或等于512 MB。

要创建字符串,请使用set命令。例如,以下set命令创建一个名为key的键key_Welcome1,该键包含字符串"Howdy":

  * set key_Welcome1 "Howdy" 


Output

OK 

要在一个命令中设置多个字符串,请使用mset:

* mset key_Welcome2 "there" key_Welcome3 "partners," 

您还可以使用以下append命令创建字符串:

* append key_Welcome4 "welcome to Texas" 

如果成功创建了字符串,append将输出等于该字符串包含多少个字符的整数:

Output

(integer) 16 

注意,append也可以用来更改字符串的内容。有关详细信息,请参见有关处理字符串的部分。

检索字符串

要检索字符串,请使用以下get命令:

  * get key_Welcome1 


Output

"Howdy" 

要使用一个命令检索多个字符串,请使用mget:

  * mget key_Welcome1 key_Welcome2 key_Welcome3 key_Welcome4 


Output

1) "Howdy" 2) "there" 3) "partners," 4) "welcome to Texas" 

对于传递给mget它的每个键都不包含字符串值或根本不存在,该命令将返回nil。

操纵弦

如果字符串由整数组成,则可以运行incr命令将其增加一:

  * set key_1 3 
  * incr key_1 


Output

(integer) 4 

同样,您可以使用以下incrby命令将数字字符串的值增加特定的增量:

  * incrby key_1 16 


Output

(integer) 20 

该decr和decrby命令的工作方式相同,但他们减少存储在数字字符串的整数:

  * decr key_1 


Output

(integer) 19 

  * decrby key_1 16 


Output

(integer) 3 

如果字母字符串已经存在,append则将值附加到现有值的末尾并返回字符串的新长度。为了说明这一点,以下命令将附加", y'all"到key所保存的字符串上key_Welcome4,因此现在该字符串将显示为"welcome to Texas, y'all":

  * append key_Welcome4 ", y'all" 


Output

(integer) 15 

您也可以将整数附加到包含数字值的字符串中。以下示例附加45到3,其中包含整数key_1,因此它将保持345。在这种情况下,append还将返回字符串的新长度,而不是其新值:

  * append key_1 45 


Output

(integer) 3 

由于此键仍仅保留数字值,因此可以对其执行incr和decr操作。您也可以在整数字符串后面附加字母字符,但是如果这样做,则在字符串上运行incr和运行decr都会产生错误,因为字符串值不再是整数。

结论

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

(书)如何管理redis数据库-4.如何在Redis中管理副本和客户端

发表于 2020-11-26

介绍

Redis是一个开源的内存中键值数据存储。它最受追捧的功能之一是的支持:任何Redis服务器都可以将其数到任意数量的副本中,从而实现高读取可伸缩性和强大的数据冗余。此外,Redis旨在允许许多客户端(默认情况下最多10000个)连接数据并与数据交互,因此对于许多用户需要访问同一数据集的情况而言,它是一个不错的选择。

本教程介绍了用于管理Redis客户端和副本的命令。

如何使用本指南

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

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

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

注意: Redis项目在其文档和各种命令中使用术语“主”和“从”来标中的不同角色,尽管该项目的参与者正在采取措施在不引起兼容性问题的情况下更改此语言。 。DigitalOcean通常更喜欢使用替代术语“主要”和“副本”。

本指南将在可能的情况下默认为“主要”和“副本”,但请注意,在某些情况下,不可避免地会出现“主”和“从”这两个术语。

管理副本

Redis最具特色的功能之一是其内置功能。使时,Redis创建主实例的精确副本。这些辅助实例在它们的连接断开时会随时重新连接到主要实例,并且始终旨在保留主要实例的精确副本。

如果不确定当前连接的Redis实例是主实例还是副本,则可以通过运行以下role命令进行检查:

* role 

如果您使用Redis Sentinel,则此命令将返回master或slave,或者可能返回。sentinel

要将Redis实例动态指定为另一个实例的副本,请运行replicaof命令。此命令将预期的主服务器的主机名或IP地址和端口作为参数:

* replicaof hostname_or_IP port 

如果服务器已经是另一台主服务器的副本,它将停旧服务器,并立即开始与新服务器同步。它还将丢弃旧数据集。

要将副本提升回主副本,请运行以下replicaof命令:

* replicaof no one 

这将阻止实主服务器,但不会丢弃的数据集。在原始主数据库失败的情况下,此语法很有用。在replicaof no one发生故障的主数据库的副本上运行后,以前的副本可以用作新的主数据库,并拥有自己的副本作为故障保护。

注意:在版本5.0.0之前,Redis包括此命令的一个版本slaveof。

管理客户

一个客户是任何机器或软件连接到服务器才能访问服务。Redis附带了一些命令,可帮助跟踪和管理客户端连接。

该client list命令返回一组有关当前客户端连接的可读信息:

  * client list 


Output

"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client " 

以下是每个字段的含义:

  • id:唯一的64位客户端ID
  • name:客户端连接的名称,由先前的client setname命令定义
  • addr:客户端连接的地址和端口
  • fd:与客户端所连接的套接字相对应的文件描述符
  • age:客户端连接的总时长,以秒为单位
  • flags:一组一个或多个单字符标志,它们提供有关客户端的更详细的详细信息;有关更多详细信息,请参见client list命令文档
  • db:客户端连接到的当前数据库ID号(可以从0到15)
  • sub:客户端订阅的频道数
  • psub:客户端的模式匹配订阅数
  • mutli:客户端已在事务中排队的命令数(将显示-1客户端是否尚未开始事务或0是否仅已开始事务且未排队任何命令)
  • qbuf:客户端的查询缓冲区长度,0表示它没有待处理的查询
  • qbuf-free:客户端查询缓冲区中的可用空间量,0表示查询缓冲区已满
  • obl:客户端的输出缓冲区长度
  • oll:客户端的输出列表的长度,当客户端的缓冲区已满时,将在其中排队答复
  • omem:客户端的输出缓冲区使用的内存
  • events:客户端的文件描述符事件,可以是r“可读”,w“可写”或两者兼有
  • cmd:客户端运行的最后一条命令

设置客户端名称对于调试使用Redis的任何应用程序中的连接泄漏都很有用。每个新连接都将在开始时没有分配的名称,但是client setname可用于为当前客户端连接创建一个新连接。尽管Redis通常将字符串长度限制为512 MB,但是对客户端名称的长度没有限制。但是请注意,客户端名称不能包含空格:

* client setname elaine 

要检索客户端连接的名称,请使用以下client getname命令:

  * client getname 


Output

"elaine" 

要获取客户端的连接ID,请使用以下client id命令:

  * client id 


Output

(integer) "19492" 

Redis客户端ID永远不会重复,并且会单调递增。这意味着,如果一个客户端的ID大于另一个客户端,则它是在以后的时间建立的。

阻止客户端并关闭客户端连接

系统通常被描述为_同步或异步_。在同中,每当客户端添加或更改数据时,客户端都必须从一定数量的副本中收到某种确认,以使更改注册为已提交。这有助于防止节点发生数据冲突,但这要付出一定的等待时间,因为客户端必须等待执行另一项操作,直到它从一定数量的副本中收到回音。

另一方面,在异中,一旦将数据写入本地存储,客户端就会看到确认操作已完成的确认。但是,这与副本实际写入数据之间可能会有时滞。如果其中一个副本在写入更改之前失败,则该写入将永远丢失。因此,尽管异允许客户端继续执行操作而没有等待副本引起的延迟,但它可能导致节点之间的数据冲突,并且可能需要数据库管理员方面的额外工作来解决这些冲突。

由于专注于性能和低延迟,Redis默认情况下实现异。但是,您可以使用该wait命令模拟同。wait在指定的时间段(以毫秒为单位)内阻止当前客户端连接,直到所有先前的写命令成功传输并被指定数量的副本接受为止。此命令使用以下语法:

* wait number_of_replicas number_of_milliseconds 

例如,如果要在30毫秒的超时时间内至少3个副本注册所有先前的写入操作之前阻止客户端连接,则wait语法应如下所示:

* wait 3 30 

该wait命令返回一个整数,该整数表示已确认写入命令的副本数,即使并非每个副本都这样做:

Output

2 

要取消阻止以前通过wait(brpop,或)xread命令阻止的客户端连接,可以client unblock使用以下语法运行命令:

* client unblock client_id 

要暂时挂起当前连接到Redis服务器的每个客户端,可以使用以下client pause命令。这在需要以受控方式更改Redis设置的情况下很有用。例如,如果要将一个副本提升为主实例,则可以事先暂停每个客户端,以便升级副本并使客户端作为新的主实例连接到该副本,而不会丢失任何写操作。

该client pause命令要求您指定要挂起客户端的时间(以毫秒为单位)。下面的示例将所有客户端暂停一秒钟:

* client pause 1000 

该client kill语法使您可以基于多个不同的过滤器关闭单个连接或一组特定的连接。语法如下所示:

* client kill filter_1 value_1 ... filter_n value_n 

在Redis 2.8.12和更高版本中,可以使用以下过滤器:

  • addr:允许您从指定的IP地址和端口关闭客户端连接
  • client-id:允许您根据其唯一ID字段关闭客户端连接
  • type:关闭一个给定类型,它可以是每一个客户端normal,master,slave,或pubsub
  • skipme:此过滤器的值选项为yes和no:
    • 如果no指定了if ,则调用该client kill命令的客户端不会被跳过,并且如果其他过滤器适用于该客户端,它将被杀死
    • 如果yes指定,则将跳过运行该命令的客户端,而kill命令将对该客户端无效。skipme始终yes默认为

结论

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

12…6

junyao

52 日志
1 标签
© 2020 junyao 粤ICP备15028622号 版权所有
访客数 人 总访问量 次