Redis进阶实践之十四 Redis-cli命令行工具使用详解

时间:2021-05-14 10:47:38

转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html

一、介绍

redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西。现在redis的东西要看的都差不多看完了。网上的东西也不多了。剩下来就看看官网的东西吧,一遍翻译,一遍测试。不错的使用体验,今天开始就写一下redis的客户端的使用,也就是redis-cli工具类,这个文件的内容真不少,一次写完有点吃力。分多次写吧。

二、使用详解

 1、redis-cli,Redis命令行界面

redis-cli是Redis命令行界面,它是一个允许向Redis发送命令、并直接从终端读取服务器发送的回复的简单的程序。

它有两种主要模式:一种交互模式,其中有一个REPL(读取评估打印循环),用户输入命令并获取回复;另一种模式是将命令作为redis-cli的参数发送,执行并打印在标准输出中。

在交互模式下,redis-cli具有基本的行编辑功能,可以提供良好的打字体验。

然而,redis-cli不仅仅具有以上功能,还有更高级的用法。有些选项可用来启动程序并将其置于特殊模式之下,以便redis-cli可以完成更复杂的任务,如模拟从站并打印从主站接收到的复制流,检查Redis服务器的延迟,并显示统计数据,甚至是延时采样和频率的ASCII-art频谱图,以及其他许多事情。

本指南将涵盖redis-cli的不同方面,从最简单到*的结尾。

如果您要广泛使用Redis,或者您已经这么做了,那么很可能会碰巧使用redis-cli。 花一些时间熟悉它可能是一个非常好的主意,一旦你知道了命令行界面的所有技巧,你就会更有效地使用Redis。

  2、命令行的用法

只需运行一个命令并在标准输出上打印其答复就如同输入要作为redis-cli的分隔参数执行的命令一样简单:

        $ redis-cli -h 192.168.127.130 -p 6379 incr mycounter         (integer) 7

该命令的结果是“7”。 由于Redis的结果是强类型的(它们可以是字符串,数组,整数,NULL,错误等等),您可以看到括号之间的就是结果的类型。 但是,当redis-cli的输出必须用作另一个命令的输入,或者我们希望将它重定向到一个文件时,这并不是一个好的做法。

实际上,redis-cli当检测到标准输出是一个tty设备时就会来显示这些附加信息以帮助提高人们的可读性。 否则,它将通过 auto-enable 启用原始输出模式,如下例所示:

        $ redis-cli -h 192.168.127.130 -p 6379 incr mycounter > /tmp/output.txt         $ cat /tmp/output.txt         8

由于CLI检测到输出不再写入终端,因此这次输出中才省略了(整数)这个显示。 你甚至可以在终端上用--raw选项强制原始输出:

        $ redis-cli -h 192.168.127.130 -p 6379 --raw incr mycounter         9

同样,通过使用--no-raw,可以在写入文件或将管道传送到其他命令时强制读取可读的输出。

 3、主机,端口,密码和数据库

默认情况下,redis-cli在127.0.0.1端口6379连接到服务器。正如您所猜测的,您可以使用命令行选项轻松更改此设置。 要指定不同的主机名或IP地址,请使用-h。 为了设置不同的端口,请使用-p。

        $ redis-cli -h 192.168.127.130 -p 6379 ping         PONG

如果您的实例受密码保护,-a <密码>选项将执行身份验证,以保证明确使用AUTH命令的需要:

        $ redis-cli -h 192.168.127.130 -p 6379 -a myUnguessablePazzzzzword123 ping         PONG

最后,可以通过使用-n <dbnum>选项发送一个命令,该命令对除默认数字零以外的数据库号进行操作:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
        $ redis-cli -h 192.168.127.130 -p 6379 flushall         OK          $ redis-cli -h 192.168.127.130 -p 6379 -n 1 incr a         (integer) 1          $ redis-cli -h 192.168.127.130 -p 6379 -n 1 incr a         (integer) 2          $ redis-cli -h 192.168.127.130 -p 6379 -n 2 incr a         (integer) 1
Redis进阶实践之十四 Redis-cli命令行工具使用详解

部分或全部信息也可以通过使用-u <uri>选项和一个有效的URI来提供:

        $ redis-cli -u redis://p%40ssw0rd@redis-16379.hosted.com:16379/0 ping         PONG

4、从其他程序获取输入

有两种方法可以使用redis-cli来获取来自其他命令的输入(基本上来自标准输入)。 一种是使用我们从标准输入读取的有效数据作为最后一个参数。 例如,假设在我的电脑里,为了将Redis的key设置到文件/etc/services的内容里,我可以使用-x选项:

        $ redis-cli -h 192.168.127.130 -p 6379 -x set foo < /etc/services         OK         $ redis-cli -h 192.168.127.130 -p 6379 getrange foo 0 50         "#\n# Network services, Internet style\n#\n# Note that "

正如您在上述会话的第一行中看到的那样,SET命令的最后一个参数未被指定。 参数只是SET foo,并没有为我希望的key设置的实际的值。

相反,指定了-x选项,并将文件重定向到CLI的标准输入。所以输入被读取,并被用作命令的最后一个参数。这对编写脚本很有用。

另一种不同的方法是为redis-cli提供一个写在文本文件中的命令序列:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
       $ cat /tmp/commands.txt         set foo 100         incr foo         append foo xxx         get foo          $ cat /tmp/commands.txt | redis-cli -h 192.168.127.130 -p 6379         OK         (integer) 101         (integer) 6         "101xxx"
Redis进阶实践之十四 Redis-cli命令行工具使用详解

command.txt中的所有命令都由redis-cli一个接一个地执行,就好像它们是由用户交互式键入的一样。 如果需要,可以在文件内使用双引号来标识字符串,这样在字符串中间就可以包含空格或换行符或其他特殊字符,但是此字符串是作为一个参数使用的:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
        $ cat /tmp/commands.txt         set foo "This is a single argument"         strlen foo         $ cat /tmp/commands.txt | redis-cli -h 192.168.127.130 -p 6379         OK         (integer) 25
Redis进阶实践之十四 Redis-cli命令行工具使用详解

5、连续运行相同的命令

在执行过程中,当用户选择暂停的情况下执行相同命令的指定次数是可行的。这在不同情况下很有用,例如,当我们想要持续监视一些 key 的内容或INFO字段输出时,或者当我们想模拟一些重复写入事件时(比如每5秒将一个新项目推入列表)。

该功能由两个选项控制:-r <count>和-i <delay>。 第一种选项表示运行命令的次数,第二种表示不同命令调用之间的延迟,以秒为单位(能够指定十进制数字,如0.1表示100毫秒)。

默认情况下,间隔(或延迟)被设置为0,所以命令只是尽快执行:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
        $ redis-cli -h 192.168.127.130 -p 6379 -r 5 incr foo         (integer) 1         (integer) 2         (integer) 3         (integer) 4         (integer) 5
Redis进阶实践之十四 Redis-cli命令行工具使用详解

要长时间运行相同的命令,请使用-1作为计数。 因此,为了随时监控RSS存储器的大小,可以使用如下的命令:

        $ redis-cli -h 192.168.127.130 -p 6379  -r -1 -i 1 INFO | grep rss_human         used_memory_rss_human:1.38M         used_memory_rss_human:1.38M         used_memory_rss_human:1.38M         ... a new line will be printed each second ...

    6、使用redis-cli大量插入数据

使用redis-cli进行大数据量插入会使用单独的章节来说,因为它本身就是一个有价值的话题。请参阅我们的《批量插入指南》。

    7、CSV输出

有时候您可能想要使用redis-cli来快速将数据从Redis导出到外部程序。 这可以使用CSV(逗号分隔值)输出功能来完成:

        $ redis-cli -h 192.168.127.130 -p 6379 lpush mylist a b c d         (integer) 4          $ redis-cli -h 192.168.127.130 -p 6379  --csv lrange mylist 0 -1         "d","c","b","a"

目前无法像这样导出整个数据库,但只能用CSV输出运行单个命令。

    8、运行Lua脚本

redis-cli对使用Lua脚本编写的新Lua调试工具提供了广泛的支持,稳定版本是从Redis 3.2开始。有关此功能,请参阅《Redis Lua调试器文档》https://redis.io/topics/ldb。

但是,即使不使用调试器,与以交互方式将脚本输入到shell或作为参数相比,您可以使用redis-cli从文件运行脚本,这种方式更加舒适:

        $ cat /tmp/script.lua return redis.call('set',KEYS[1],ARGV[1])         $ redis-cli -h 192.168.127.130 -p 6379 --eval /tmp/script.lua foo , bar         OK

Redis EVAL命令将脚本使用的键列表和其他非键参数作为不同的数组。在调用EVAL命令时,您可以将key的数量作为一个数字提供。 但是,使用redis-cli并使用上面的--eval选项,并没有明确指定key的数量。相反,它使用用逗号分隔键和参数。这就是为什么在上面的调用中你看到foo,bar作为参数。

所以foo会填充KEYS数组,bar会填充ARGV数组。

编写简单脚本时,--eval选项很有用。对于更复杂的工作,使用Lua调试器肯定更适合。可以混合使用这两种方法,因为调试器也使用来自外部文件的执行脚本。

    9、交互模式

到目前为止,我们探讨了如何使用Redis CLI作为命令行程序。 这对于脚本和某些类型的测试非常有用,但是大多数人的大部分时间将会使用redis-cli的交互模式。

在交互模式下,用户在提示符下键入Redis命令。该命令被发送到服务器,进行处理,回复被解析回来并呈现为更简单的形式来阅读。

在交互模式下运行CLI不需要什么特别的东西 - 在没有任何参数的情况下运行即可,并且您处于:

        $ redis-cli -h 192.168.127.139 -p 6379         192.168.127.130:6379> ping         PONG

字符串192.168.127.130:6379>是提示符。它提醒您,您已连接到给定的Redis实例。
        
            当连接的服务器发生更改时,或者当您在与数据库编号0不同的数据库上运行时,提示会发生的更改:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
        192.168.127.130:6379> select 2         OK         192.168.127.130:6379[2]> dbsize         (integer) 1         192.168.127.130:6379[2]> select 0         OK         192.168.127.130:6379> dbsize         (integer) 503
Redis进阶实践之十四 Redis-cli命令行工具使用详解

   9.1、处理连接和重新连接

在交互模式下使用connect命令可以通过指定我们要连接的主机名和端口来连接到不同的实例:

            192.168.127.130:6379> connect metal 6379             metal:6379> ping             PONG

正如你所看到的以下的提示也会有相应的改变。如果用户尝试连接到无法访问的实例,则redis-cli将进入断开连接模式,并且准备使用新命令尝试重新连接:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
            192.168.127.130:6379> connect 192.168.127.130 9999             Could not connect to Redis at 192.168.127.130:9999: Connection refused              not connected> ping             Could not connect to Redis at 192.168.127.130:9999: Connection refused              not connected> ping             Could not connect to Redis at 192.168.127.130:9999: Connection refused
Redis进阶实践之十四 Redis-cli命令行工具使用详解

通常在检测到断开连接后,CLI始终尝试以透明方式重新连接:如果尝试失败,则会显示错误并进入断开连接状态。 以下是断开和重新连接的示例:

            192.168.127.130:6379> debug restart             Could not connect to Redis at 192.168.127.130:6379: Connection refused             not connected> ping             PONG             192.168.127.130:6379> (now we are connected again)

当执行重新连接时,redis-cli会自动重新选择所选的上一个数据库编号。然而,关于连接的所有其他状态都会丢失,例如,事务的状态信息就会丢失,当我们处于事务的执行过程中的时候:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
            $ redis-cli -h 192.168.127.130 -p 6379             192.168.127.130:6379> multi             OK              192.168.127.130:6379> ping             QUEUED              ( here the server is manually restarted )              192.168.127.130:6379> exec             (error) ERR EXEC without MULTI
Redis进阶实践之十四 Redis-cli命令行工具使用详解

在交互模式下使用CLI进行测试时,这通常不是问题,但您应该了解这一限制。

     9.2、编辑,历史和完成

由于redis-cli使用《linenoise行编辑库》,因此它一直具有行编辑功能,而不依赖于libreadline或其他可选库。

您可以访问已执行的命令的历史记录,以便通过按方向键(上和下)来避免重复键入它们。在用户主目录内的一个名为.rediscli_history的文件中,指定HOME环境变量,在重新启动CLI的时候保留历史记录。  可以通过设置 REDISCLI_HISTFILE 环境变量来使用不同的历史文件名,并通过将其设置为 /dev/null 来禁用它。

CLI客户端还能够通过按TAB键执行命令名称的补全操作,<TAB>表示按TAB键,如下例所示:

            192.168.127.130:6379> Z<TAB>             192.168.127.130:6379> ZADD<TAB>             192.168.127.130:6379> ZCARD<TAB>

 9.3、运行相同的命令N次

可以通过在命令名前添加一个数字来多次运行相同的命令:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
            192.168.127.130:6379> 5 incr mycounter             (integer) 1             (integer) 2             (integer) 3             (integer) 4             (integer) 5
Redis进阶实践之十四 Redis-cli命令行工具使用详解

9.4、显示有关Redis命令的帮助

Redis有很多命令,有时候,当你测试的时候,你可能不记得参数的确切顺序。redis-cli使用help命令为大多数Redis命令提供联机帮助。 该命令可以以两种形式使用:

 1、help @ <category>显示关于给定类别的所有命令。 类别包括:@generic,@list,@set,@sorted_set,@hash,@pubsub,@transactions,@connection,@server,@scripting,@hyperloglog。

2、help <commandname>显示作为参数给出的命令的特定帮助。

例如,为了显示PFADD命令的帮助,使用:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
            192.168.127.130:6379> help PFADD               PFADD key element [element ...]              summary: Adds the specified elements to the specified HyperLogLog.              since: 2.8.9              group: hyperloglog
Redis进阶实践之十四 Redis-cli命令行工具使用详解

PFADD key element [element ...]
                  摘要:将指定的元素添加到指定的HyperLogLog。 
                  从版本:2.8.9

请注意,帮助也支持TAB补全功能。

9.5、清除终端屏幕

在交互模式下使用 clear 命令将清除终端屏幕。

   

10、特殊的操作模式

到目前为止,我们看到了redis-cli的两种主要模式。

1、命令行执行Redis命令。

2、交互式的“REPL-like”用法。

        然而,CLI执行与Redis相关的其他辅助任务,这些任务将在下一节中介绍:

1、监控工具显示有关Redis服务器的连续统计信息。

2、扫描Redis数据库查找非常大的key。

3、与模式匹配的key空间扫描仪。

4、作为Pub/Sub客户订阅频道。

5、监视Redis实例中执行的命令。

6、以不同方式检查Redis服务器的延迟。

7、检查本地计算机的调度程序延迟。

8、从远程Redis服务器传输RDB备份到本地。

9、扮演Redis从节点的角色,展现从节点所接受的东西。

10、模拟LRU工作负载以显示有关按键命中的统计信息。

11、Lua调试器的客户端。

10.1、连续统计模式

这可能是redis-cli的最不常用的功能之一,并且对于实时监控Redis实例来说是非常有用。要启用此模式,使用--stat选项。 在这种模式下,CLI的行为非常清晰的:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                            $ redis-cli -h 192.168.127.130 -p 6379 --stat                             ------- data ------ --------------------- load -------------------- - child -                             keys       mem      clients blocked requests            connections                             506        1015.00K 1       0       24 (+0)             7                             506        1015.00K 1       0       25 (+1)             7                             506        3.40M    51      0       60461 (+60436)      57                             506        3.40M    51      0       146425 (+85964)     107                             507        3.40M    51      0       233844 (+87419)     157                             507        3.40M    51      0       321715 (+87871)     207                             508        3.40M    51      0       408642 (+86927)     257                             508        3.40M    51      0       497038 (+88396)     257
Redis进阶实践之十四 Redis-cli命令行工具使用详解

在这种模式下,每秒都会打印一条新的数据行,其中包含有用信息和旧数据点之间的差异。 您可以轻松了解内存使用情况,客户端的链接等情况。

在这种情况下,-i <interval>选项的作用就是修改输出新数据行的频率。 默认值是一秒。

             10.2、大键扫描

在这种特殊模式下,redis-cli可用作key空间容量大小的分析器。 它扫描占据比较大空间的key的数据集合,并能提供有关数据集组成的数据类型的信息。 该模式使用--bigkeys 选项启用,并生成十分详细的输出:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                          [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --bigkeys                             # Scanning the entire keyspace to find biggest keys as well as average sizes per key type.                            # 扫描整个键的空间以查找最大键以及每种键类型的平均大小。                            # You can use -i 0.1 to sleep 0.1 sec per 100 SCAN commands (not usually needed).                            # 您可以使用-i 0.1来每100次SCAN命令休息0.1秒(通常不需要)。                             [00.00%] Biggest string found so far 'ss' with 1 bytes                            [00.00%] Biggest string found so far 'foo1' with 25 bytes                             -------- summary -------                            Sampled 5 keys in the keyspace!                           Total key length in bytes is 20 (avg len 4.00)                            Biggest string found 'foo1' has 25 bytes                            5 strings with 35 bytes (100.00% of keys, avg size 7.00)                           0 lists with 0 items (00.00% of keys, avg size 0.00)                           0 sets with 0 members (00.00% of keys, avg size 0.00)                           0 hashs with 0 fields (00.00% of keys, avg size 0.00)                           0 zsets with 0 members (00.00% of keys, avg size 0.00)
Redis进阶实践之十四 Redis-cli命令行工具使用详解

在输出的第一部分中,报告每个大于前一个较大键(相同类型)的新键。 摘要部分提供有关Redis实例内数据的一般统计信息。

该程序使用 SCAN 命令,因此它可以在不影响客户端操作的情况下在繁忙的服务器上执行,不过也可以使用-i选项来限制所请求的每100个键的扫描过程的秒数。 例如,-i 0.1会减慢程序的执行速度,但也会大幅减轻服务器上的负载。

请注意,摘要还会以更清晰的形式反映每次发现的最大键。 如果针对一个非常大的数据集运行,最初的输出只是提供一些有趣的信息ASAP。

                 10.3、获取键的列表

还可以扫描密钥空间,再次以不阻塞Redis服务器的方式(当您使用诸如 KEYS * 之类的命令时会发生这种情况),并打印所有键的名称,或者使用特定模式进行过滤。 此模式与 --bigkeys 选项一样,使用SCAN命令,如果数据集正在发生更改,键就可能会多次反映更改,但如果从迭代开始以来就存在该键,那么该键也不会丢失。由于它使用这个选项的命令叫做--scan。

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                        [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --scan | more -8                          name                          age                          aaa                          myset                          myhash                          address                          myzset                          rlist
Redis进阶实践之十四 Redis-cli命令行工具使用详解

请注意,使用 head -8 仅用于打印输出所有数据的前8行。

scan命令可以配合 --pattern 选项使用模式匹配进行扫描

                      [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --scan --pattern 'a*'                        age                        aaa                        address

根据键的名称,通过使用wc命令可以使管道输出针对特定种类对象的计数:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                      [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --scan --pattern 'a*'                       age                       aaa                       address                        [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --scan --pattern 'a*' | wc -l                       3
Redis进阶实践之十四 Redis-cli命令行工具使用详解

wc -l 这个选项的 -l,横杠后面是英文字母 L 的小写,不是数字 1。

                10.4、发布/订阅模式

只需使用PUBLISH命令,CLI就能够在 Redis Pub/Sub通道中发布消息。这是预期的,因为PUBLISH命令与其他任何命令非常相似,使用简单。订阅频道为了接收消息使用了特殊的方法 - 在这种情况下,我们需要阻止和等待消息,此方法是作为redis-cli中的特殊模式实现的。 与其他特殊模式不同,此模式不是通过使用特殊选项启用的,而是通过使用SUBSCRIBE或PSUBSCRIBE命令启用的,无论是交互模式还是非交互模式:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                        //非系统级通用通道                         [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 psubscribe '*'                         Reading messages... (press Ctrl-C to quit)                         1) "psubscribe"                         2) "*"                         3) (integer) 1                          //单一通道                         [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 psubscribe mychannel                         Reading messages... (press Ctrl-C to quit)                         1) "psubscribe"                         2) "*"                         3) (integer) 1
Redis进阶实践之十四 Redis-cli命令行工具使用详解

’*’ 带有单引号的星号表示非系统发布的消息通道,可以接受来自任何用户定义通道的信息,当然也可以输入具体名称的通道,比如:mychannel,我们针对具体名称的通道发布信息,必须制定通道名称,否则无效。

* 单独星号,没有单引号包含的,会显示系统当前所有发布的通道,如下:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                       [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 psubscribe *                         Reading messages... (press Ctrl-C to quit)                         1) "psubscribe"                         2) "datas"                         3) (integer) 1                         1) "psubscribe"                         2) "logs"                         3) (integer) 2                         1) "psubscribe"                         2) "redis-benchmark"                         3) (integer) 3                         1) "psubscribe"                         2) "redis-cli"                         3) (integer) 4                         1) "psubscribe"                         2) "redis.conf"                         3) (integer) 5                         1) "psubscribe"                         2) "redis-sentinel"                         3) (integer) 6                         1) "psubscribe"                         2) "redis-server"                         3) (integer) 7                         1) "psubscribe"                         2) "redis-trib.rb"                         3) (integer) 8                         1) "psubscribe"                         2) "sentinel.conf"                         3) (integer) 9
Redis进阶实践之十四 Redis-cli命令行工具使用详解

阅读消息,消息显示我们输入了 Pub/Sub 模式。 当其他客户端在某个频道发布某条消息时(例如,您可以使用redis-cli PUBLISH mychannel mymessage),Pub/Sub模式中的CLI将显示如下内容:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                         [root@linux redis]#  redis-cli -h 192.168.127.130 -p 6379 publish mychannel mymessage                          (integer) 1                           显示内容:                          1) "pmessage"                          2) "*"                          3) "mychannel"                          4) "mymessage"
Redis进阶实践之十四 Redis-cli命令行工具使用详解

这对调试 发布/订阅 的问题非常有用。要退出发布/订阅模式只需处理CTRL-C。

                  10.5、监视在Redis中执行的命令

与 Pub/Sub 模式类似,使用MONITOR模式后,将自动输入监控模式。它将打印Redis实例收到的所有命令:

                          [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 monitor                           OK                           1520321617.017015 [0 192.168.127.130:34984] "publish" "mych" "mymessage"                           1520321654.339150 [0 192.168.127.130:34986] "set" "sex" "1"

请注意,可以使用管道输出,因此您可以使用诸如grep等工具监视特定模式。

10.6、 监视Redis实例的延迟

Redis经常用于延迟非常严重的环境中。延迟涉及应用程序中的多个动态的部分,从客户端库到网络堆栈,再到Redis实例本身。

CLI有多种功能用于研究Redis实例的延迟并了解延迟的最大值,平均值和分布。

基本的延迟检查工具是 --latency 选项。 使用此选项,CLI运行一个循环,将PING命令发送到Redis实例,并测量获得答复的时间。这种情况每秒发生100次,统计信息在控制台中实时更新:

                       [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --latency                        min: 0, max: 3, avg: 0.28 (1051 samples)

统计数据以毫秒计数。通常情况下,由于系统内核调度程序运行redis-cli本身所导致的延迟,所以一个非常快的实例的平均延迟往往被高估了一点,所以0.19以上的平均延迟可能是0.01或更少。然而,这通常不是一个大问题,因为我们对几毫秒或更长时间的事件才感兴趣。

有时候,研究平均延迟期的最大值和平均值如何随时间发展是有用的。--latency-history选项用于此目的:它的工作方式与--latency完全相同,但每15秒(默认情况下)一个全新的采样会话从头开始:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                      [root@linux ~]# redis-cli -h 192.168.127.130 -p 6379 --latency-history                        min: 0, max: 6, avg: 0.35 (1230 samples) -- 15.00 seconds range                        min: 0, max: 3, avg: 0.34 (1277 samples) -- 15.01 seconds range                        min: 0, max: 6, avg: 0.30 (1272 samples) -- 15.00 seconds range                        min: 0, max: 2, avg: 0.33 (1289 samples) -- 15.00 seconds range                        min: 0, max: 4, avg: 0.36 (1312 samples) -- 15.01 seconds range                        min: 0, max: 1, avg: 0.24 (67 samples)^C
Redis进阶实践之十四 Redis-cli命令行工具使用详解

您可以使用-i <interval>选项更改采样会话的时间间隔步长。

最先进的延迟研究工具,对于没有经验的用户来说也有点难解释明白,因此使用彩色终端显示一系列延迟是一种能力。您将看到一个彩色输出,指示不同样本的百分比,以及不同的ASCII字符表示不同的延迟数字。 使用 --latency-dist 选项启用此模式:

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                        [root@linux ~]# redis-cli -h 192.168.127.130 -p 6379 --latency-dist                         ---------------------------------------------                         . - * #          .01 .125 .25 .5 milliseconds                         1,2,3,...,9      from 1 to 9     milliseconds                         A,B,C,D,E        10,20,30,40,50  milliseconds                         F,G,H,I,J        .1,.2,.3,.4,.5       seconds                         K,L,M,N,O,P,Q,?  1,2,4,8,16,30,60,>60 seconds                         From 0 to 100%:                                             ---------------------------------------------                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?                         .-*#123456789ABCDEFGHIJKLMNOPQ?
Redis进阶实践之十四 Redis-cli命令行工具使用详解

在redis-cli中还有另一个非常不寻常的延迟工具。它不会检查Redis实例的延迟,而是检查运行redis-cli的计算机的延迟。你可能会问什么延迟? 内核调度程序固有的延迟,管理虚拟化实例的程序的延迟等等。

我们称之为内部延迟,因为它对大多数程序员来说是不透明的。 如果您的Redis实例延迟不佳,任何微不足道的事情都有可能是造成延迟的罪魁祸首,那么通过在运行Redis服务器的系统中直接在此特殊模式下运行redis-cli,可以检查系统的最佳性能。

通过测量内部延迟,您知道这是基准,Redis无法超越您的系统。为了在此模式下运行CLI,请使用--intrinsic-latency <test-time>。 测试的时间以秒为单位,并指定redis-cli多少秒可以检查一次当前正在运行的系统的延迟。

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                      [root@linux ~]# redis-cli -h 192.168.127.130 -p 6379 --intrinsic-latency 5                        Max latency so far: 1 microseconds.                        Max latency so far: 88 microseconds.                        Max latency so far: 120 microseconds.                        Max latency so far: 950 microseconds.                        Max latency so far: 1192 microseconds.                        Max latency so far: 1830 microseconds.                        Max latency so far: 2107 microseconds.                        32993317 total runs (avg latency: 0.1515 microseconds / 151.55 nanoseconds per run).                       Worst run took 13903x longer than the average latency.
Redis进阶实践之十四 Redis-cli命令行工具使用详解

重要提示:必须在要运行Redis服务器的计算机上执行此命令,而不是在不同的主机上执行此命令。 它甚至不连接到Redis实例,只在本地执行测试。

在上述情况下,我的系统不可能比最糟延迟2107微秒的情况更好,所以我可以期望某些查询在不到1毫秒的时间内运行。

10.7、远程备份RDB文件

在Redis复制的第一次同步期间,主设备和从设备以RDB文件的形式交换整个数据集。redis-cli利用此功能来提供远程备份功能,该功能允许将RDB文件从任何Redis实例传输到运行redis-cli的本地计算机。要使用此模式,请使用--rdb <dest-filename>选项调用CLI:

                      [root@linux ~]# redis-cli -h 192.168.127.130 -p 6379 --rdb /tmp/dump.rdb                       SYNC sent to master, writing 534 bytes to '/tmp/dump.rdb'                       Transfer finished with success.

这是确保您拥有Redis实例的灾难恢复RDB备份文件的简单而有效的方法。 但是,在脚本或cron作业中使用此选项时,请确保检查命令的返回值。如果它不为零,则发生错误,如下例所示:

                      [root@linux ~]# redis-cli -h 192.168.127.130 -p 6379 --rdb /tmp/dump.rdb                       SYNC sent to master, writing 534 bytes to '/tmp/dump.rdb'                       Transfer finished with success.                       [root@linux ~]# echo $?                        0

         10.8、从模式

CLI的从属模式是一种高级功能,可用于Redis开发人员和调试操作。它允许检查主站发送到复制流中的从站以便将写入传播到其副本。选项名称简单--slave。示例代码如下:

                      [root@linux ~]# redis-cli -h 192.168.127.129 -p 6379 --slave                       SYNC with master, discarding 535 bytes of bulk transfer...                       SYNC done. Logging commands from master.

该命令首先丢弃第一个同步的RDB文件,然后以CSV格式记录每个收到的命令。

如果您认为某些命令未在您的从站中正确复制,这也是检查发生了什么事情的好方法,对于改进错误报告也是有用的信息。

        10.9、执行LRU模拟

Redis通常用作LRU驱逐的缓存。根据键(key)的数量和为缓存分配的内存量(通过maxmemory指令指定),缓存命中和未命中的数量将会改变。有时,模拟命中率对正确配置缓存非常有用。

CLI有一个特殊模式,它在请求模式中使用80-20%幂律分布来执行对GET和SET操作的模拟。这意味着20%的键将被80%的时间用来请求,这是缓存场景中的普遍存在的定律。

从理论上来讲,基于给定的请求分布和Redis内存开销,可以用数学公式分析并计算命中率。 但是,Redis可以配置为不同的LRU设置(样本数量),并且LRU的实现(在Redis中近似)在不同版本之间也会有很大的变化。类似地,每个键的内存容量在各个版本之间也可能会有所不同。这就是为什么创建这个工具的原因:它的主要动机是测试Redis的LRU实现的质量,但现在也可用于测试给定版本的行为与您为部署考虑的设置的关系。

为了使用此模式,您需要指定测试中的键的数量。您还需要为maxmemory设置一个有意义值的作为第一次尝试。

重要注意事项:在Redis配置中配置maxmemory设置至关重要:如果没有最大内存使用量上限,则由于所有键均可存储在内存中,因此命中率最终将为100%。 或者,如果您指定的键太多而没有最大内存,则最终将使用所有计算机RAM。 还需要配置适当的maxmemory策略,大部分时间是allkeys-lru。

在以下示例中,我配置了最大内存限制是100MB,并使用1000万个键对LRU进行了模拟。

警告:测试使用流水线并会给服务器带来压力,请勿将其用于生产实例。

Redis进阶实践之十四 Redis-cli命令行工具使用详解
                    [root@linux redis]# redis-cli -h 192.168.127.130 -p 6379 --lru-test 10000000                     156000 Gets/sec | Hits: 4552 (2.92%) | Misses: 151448 (97.08%)                     153750 Gets/sec | Hits: 12906 (8.39%) | Misses: 140844 (91.61%)                     159250 Gets/sec | Hits: 21811 (13.70%) | Misses: 137439 (86.30%)                     151000 Gets/sec | Hits: 27615 (18.29%) | Misses: 123385 (81.71%)                     145000 Gets/sec | Hits: 32791 (22.61%) | Misses: 112209 (77.39%)                     157750 Gets/sec | Hits: 42178 (26.74%) | Misses: 115572 (73.26%)                     154500 Gets/sec | Hits: 47418 (30.69%) | Misses: 107082 (69.31%)                     151250 Gets/sec | Hits: 51636 (34.14%) | Misses: 99614 (65.86%)
Redis进阶实践之十四 Redis-cli命令行工具使用详解

该程序每秒显示统计信息。 如您所见,在第一秒钟内缓存开始被填充。 丢失率稍后稳定在我们可以预期的实际数字中:

                    120750 Gets/sec | Hits: 48774 (40.39%) | Misses: 71976 (59.61%)                     122500 Gets/sec | Hits: 49052 (40.04%) | Misses: 73448 (59.96%)                     127000 Gets/sec | Hits: 50870 (40.06%) | Misses: 76130 (59.94%)                     124250 Gets/sec | Hits: 50147 (40.36%) | Misses: 74103 (59.64%)

对于我们的用例来说,59%的丢失率可能是不可接受的。所以我们知道100MB内存是不够的。让我们试试500MB字节。几分钟后,我们会看到输出稳定到以下数字:

                    140000 Gets/sec | Hits: 135376 (96.70%) | Misses: 4624 (3.30%)                     141250 Gets/sec | Hits: 136523 (96.65%) | Misses: 4727 (3.35%)                     140250 Gets/sec | Hits: 135457 (96.58%) | Misses: 4793 (3.42%)                     140500 Gets/sec | Hits: 135947 (96.76%) | Misses: 4553 (3.24%)

因此我们知道在500MB的情况下,我们的键数量支持足够多(1000万)和分布也很合理(80-20方式)。

三、总结

好了,今天就写到这里了,剩下还有很多高级的内容需要些,慢慢来,一口不能吃一个胖子,而且翻译起来也挺耗时间的。剩下的内容就留到下一篇文章吧。继续努力,不能松懈。如果想看原文,地址如下:https://redis.io/topics/rediscli。