Redis CLI

redis-cli(Redis命令行界面)概述

在交互模式下,redis-cli 具有基本的行编辑功能,提供熟悉的输入体验。

要在特殊模式下启动程序,可以使用几个选项,包括

  • 模拟副本,并打印它从主服务器接收到的复制流。
  • 检查Redis服务器的延迟并显示统计信息。
  • 请求延迟采样和频率的ASCII艺术频谱图。

本主题涵盖了redis-cli的各个方面,从最简单的开始,到更高级的功能。

命令行用法

要在终端运行Redis命令并返回标准输出,请将要执行的命令作为redis-cli的单独参数包含进来

$ redis-cli INCR mycounter
(integer) 7

命令的回复是"7"。由于Redis回复是有类型的(字符串、数组、整数、nil、错误等),您会在括号中看到回复的类型。当需要将redis-cli的输出用作另一个命令的输入或重定向到文件时,这些额外信息可能不是理想选择。

redis-cli 只有在检测到标准输出是tty或终端时,才会显示额外信息以提高可读性。对于所有其他输出,它会自动启用原始输出模式,如下例所示

$ redis-cli INCR mycounter > /tmp/output.txt
$ cat /tmp/output.txt
8

请注意,输出中省略了(integer),因为redis-cli 检测到输出不再写入终端。您可以使用--raw 选项即使在终端上强制使用原始输出

$ redis-cli --raw INCR mycounter
9

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

字符串引用和转义

redis-cli解析命令时,空格字符会自动分隔参数。在交互模式下,换行符会将命令发送进行解析和执行。要输入包含空格或不可打印字符的字符串值,可以使用引用和转义字符串。

引用字符串值用双引号 (") 或单引号 (') 括起来。转义序列用于将不可打印字符放入字符和字符串字面值中。

转义序列包含一个反斜杠 (\) 符号,后跟一个转义序列字符。

双引号字符串支持以下转义序列

  • \" - 双引号
  • \n - 换行
  • \r - 回车
  • \t - 水平制表符
  • \b - 退格
  • \a - 响铃
  • \\ - 反斜杠
  • \xhh - 由十六进制数 (hh) 表示的任何ASCII字符

单引号假定字符串是字面值,并且只允许以下转义序列

  • \' - 单引号
  • \\ - 反斜杠

例如,要在两行上返回 Hello World

127.0.0.1:6379> SET mykey "Hello\nWorld"
OK
127.0.0.1:6379> GET mykey
Hello
World

当您输入包含单引号或双引号的字符串时,例如在密码中,请对字符串进行转义,如下所示

127.0.0.1:6379> AUTH some_admin_user ">^8T>6Na{u|jp>+v\"55\@_;OU(OR]7mbAYGqsfyu48(j'%hQH7;v*f1H${*gD(Se'"

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

默认情况下,redis-cli 连接到地址为127.0.0.1、端口为6379的服务器。您可以使用几个命令行选项更改端口。要指定不同的主机名或IP地址,请使用-h选项。要设置不同的端口,请使用-p

$ redis-cli -h redis15.localnet.org -p 6390 PING
PONG

如果您的实例受密码保护,-a <password> 选项将执行身份验证,从而无需显式使用AUTH 命令

$ redis-cli -a myUnguessablePazzzzzword123 PING
PONG

注意: 出于安全原因,请通过REDISCLI_AUTH 环境变量自动向redis-cli 提供密码。

最后,可以使用-n <dbnum> 选项发送在除默认数据库编号零以外的数据库编号上操作的命令

$ redis-cli FLUSHALL
OK
$ redis-cli -n 1 INCR a
(integer) 1
$ redis-cli -n 1 INCR a
(integer) 2
$ redis-cli -n 2 INCR a
(integer) 1

部分或全部这些信息也可以通过使用-u <uri> 选项和URI模式redis://user:password@host:port/dbnum 提供

$ redis-cli -u redis://LJenkins:p%[email protected]:16379/0 PING
PONG

注意: user、password和dbnum是可选的。对于没有用户名的身份验证,请使用用户名default。对于TLS,请使用方案rediss

您可以使用-4-6 参数分别设置DNS查找时对IPv4或IPv6的偏好。

SSL/TLS

默认情况下,redis-cli 使用普通TCP连接连接到Redis。您可以使用--tls 选项启用SSL/TLS,同时使用--cacert--cacertdir 配置受信任的根证书捆绑包或目录。

如果目标服务器需要使用客户端证书进行身份验证,您可以使用--cert--key 指定证书和相应的私钥。

从其他程序获取输入

有两种方式可以使用redis-cli 通过标准输入接收来自其他命令的输入。一种是将目标有效载荷作为stdin的最后一个参数。例如,要将Redis键net_services 设置为本地文件系统上文件/etc/services 的内容,请使用-x 选项

$ redis-cli -x SET net_services < /etc/services
OK
$ redis-cli GETRANGE net_services 0 50
"#\n# Network services, Internet style\n#\n# Note that "

在上述会话的第一行,redis-cli 使用-x 选项执行,并将文件重定向到CLI的标准输入,作为满足SET net_services 命令短语的值。这对于脚本编写非常有用。

另一种方法是将写在文本文件中的一系列命令馈送给redis-cli

$ cat /tmp/commands.txt
SET item:3374 100
INCR item:3374
APPEND item:3374 xxx
GET item:3374
$ cat /tmp/commands.txt | redis-cli
OK
(integer) 101
(integer) 6
"101xxx"

commands.txt 中的所有命令都由redis-cli 连续执行,就像用户在交互模式下输入一样。如果需要,字符串可以在文件中引用,以便可能存在包含空格、换行符或其他特殊字符的单个参数

$ cat /tmp/commands.txt
SET arg_example "This is a single argument"
STRLEN arg_example
$ cat /tmp/commands.txt | redis-cli
OK
(integer) 25

连续运行同一命令

可以按照指定的次数执行单个命令,并在每次执行之间设置用户选择的暂停时间。这在不同情况下非常有用——例如,当我们想要持续监视某个键的内容或INFO 字段输出时,或者当我们想要模拟某些周期性写入事件时,例如每5秒将新项目推入列表。

此功能由两个选项控制:-r <count>-i <delay>-r 选项指定运行命令的次数,-i 设置不同命令调用之间的延迟(以秒为单位,可以指定0.1等值来表示100毫秒)。

默认情况下,间隔(或延迟)设置为0,因此命令会尽快执行

$ redis-cli -r 5 INCR counter_value
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

要无限期运行同一命令,请使用-1 作为计数。要随时监视RSS内存大小,可以使用以下命令

$ redis-cli -r -1 -i 1 INFO | grep rss_human
used_memory_rss_human:2.71M
used_memory_rss_human:2.73M
used_memory_rss_human:2.73M
used_memory_rss_human:2.73M
... a new line will be printed each second ...

使用redis-cli 进行大量数据插入

使用redis-cli 进行大量插入在一个单独的页面中介绍,因为它本身就是一个值得探讨的主题。请参阅我们的大量插入指南

CSV输出

redis-cli 中存在一个CSV(逗号分隔值)输出功能,用于将数据从Redis导出到外部程序。

$ redis-cli LPUSH mylist a b c d
(integer) 4
$ redis-cli --csv LRANGE mylist 0 -1
"d","c","b","a"

请注意,--csv 标志仅适用于单个命令,而不能作为导出整个数据库的方式使用。

运行Lua脚本

从Redis 3.2开始,redis-cli 对使用Lua脚本调试功能提供了广泛支持。有关此功能,请参阅Redis Lua调试器文档

即使不使用调试器,也可以使用redis-cli 将脚本文件作为参数运行

$ cat /tmp/script.lua
return redis.call('SET',KEYS[1],ARGV[1])
$ redis-cli --eval /tmp/script.lua location:hastings:temp , 23
OK

Redis EVAL 命令将脚本使用的键列表和非键参数作为不同的数组。调用EVAL 时,您需要提供键的数量作为一个数字。

当使用上述--eval 选项调用redis-cli 时,无需显式指定键的数量。相反,它使用逗号分隔键和参数的约定。这就是为什么在上述调用中您会看到location:hastings:temp , 23 作为参数。

因此,location:hastings:temp 将填充KEYS 数组,而23 将填充ARGV 数组。

--eval 选项在编写简单脚本时非常有用。对于更复杂的工作,建议使用Lua调试器。可以混合使用这两种方法,因为调试器也可以执行外部文件中的脚本。

交互模式

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

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

在交互模式下运行redis-cli 不需要做任何特殊事情 - 只需不带任何参数执行它即可

$ redis-cli
127.0.0.1:6379> PING
PONG

字符串127.0.0.1:6379> 是提示符。它显示连接的Redis服务器实例的主机名和端口。

当连接的服务器更改或在非数据库零的其他数据库上操作时,提示符会相应更改

127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> DBSIZE
(integer) 1
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> DBSIZE
(integer) 503

处理连接和重新连接

在交互模式下使用CONNECT 命令可以连接到不同的实例,只需指定我们想要连接的主机名端口

127.0.0.1:6379> CONNECT metal 6379
metal:6379> PING
PONG

如您所见,当连接到不同的服务器实例时,提示符会相应更改。如果尝试连接到无法访问的实例,redis-cli 会进入断开连接模式,并在每个新命令发出时尝试重新连接

127.0.0.1:6379> CONNECT 127.0.0.1 9999
Could not connect to Redis at 127.0.0.1:9999: Connection refused
not connected> PING
Could not connect to Redis at 127.0.0.1:9999: Connection refused
not connected> PING
Could not connect to Redis at 127.0.0.1:9999: Connection refused

通常,检测到断开连接后,redis-cli 总是会透明地尝试重新连接;如果尝试失败,它会显示错误并进入断开连接状态。以下是断开连接和重新连接的示例

127.0.0.1:6379> INFO SERVER
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> PING
PONG
127.0.0.1:6379> 
(now we are connected again)

执行重新连接时,redis-cli 会自动重新选择上次选择的数据库编号。但是,有关连接的所有其他状态都会丢失,例如MULTI/EXEC事务中的状态

$ redis-cli
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> PING
QUEUED

( here the server is manually restarted )

127.0.0.1:6379> EXEC
(error) ERR EXEC without MULTI

在使用redis-cli 的交互模式进行测试时,这通常不是问题,但应该了解此限制。

使用-t <timeout> 选项指定服务器超时时间(秒)。

编辑、历史记录、补全和提示

由于redis-cli 使用了linenoise行编辑库,它始终具有行编辑功能,不依赖于libreadline 或其他可选库。

可以通过按箭头键(上和下)访问命令执行历史记录,以避免重复输入命令。历史记录在CLI重新启动之间保留,保存在用户主目录中名为.rediscli_history 的文件中,具体位置由HOME 环境变量指定。可以通过设置REDISCLI_HISTFILE 环境变量使用不同的历史记录文件名,并将其设置为/dev/null 来禁用它。

redis-cli 客户端还能够通过按TAB键执行命令名称补全,如下例所示

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

一旦在提示符处输入了Redis命令名称,redis-cli 将显示语法提示。像命令历史记录一样,此行为可以通过redis-cli 偏好设置开启和关闭。

支持反向历史搜索,例如终端中的CTRL-R

偏好设置

有两种方法可以自定义redis-cli 的行为。启动时,CLI会加载主目录中的文件.redisclirc。您可以通过将REDISCLI_RCFILE 环境变量设置为备用路径来覆盖文件的默认位置。偏好设置也可以在CLI会话期间设置,在这种情况下,它们只会在会话持续期间有效。

要设置偏好设置,请使用特殊的:set 命令。以下偏好设置可以通过在CLI中输入命令或将其添加到.redisclirc 文件中进行设置

  • :set hints - 启用语法提示
  • :set nohints - 禁用语法提示

运行同一命令N次

在交互模式下,可以在命令名称前加上一个数字来多次运行同一命令

127.0.0.1:6379> 5 INCR mycounter
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

显示Redis命令的在线帮助

redis-cli 使用HELP 命令为大多数Redis 命令提供在线帮助。该命令有两种用法

  • HELP @<category> 显示给定类别的所有命令。类别包括
    • @通用
    • @字符串
    • @列表
    • @集合
    • @有序集合
    • @哈希
    • @发布订阅
    • @事务
    • @连接
    • @服务器
    • @脚本
    • @HyperLogLog
    • @集群
    • @地理位置
    • @流
  • HELP <commandname> 显示作为参数给出的命令的特定帮助。

例如,要显示PFADD 命令的帮助,请使用

127.0.0.1:6379> HELP PFADD

PFADD key element [element ...]
summary: Adds the specified elements to the specified HyperLogLog.
since: 2.8.9

请注意,HELP 也支持TAB补全。

清除终端屏幕

在交互模式下使用CLEAR 命令可以清除终端屏幕。

特殊操作模式

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

  • 通过命令行执行Redis命令。
  • 交互式“REPL”用法。

CLI还执行与Redis相关的其他辅助任务,这些将在下一节中解释

  • 用于显示Redis服务器连续统计信息的监视工具。
  • 扫描Redis数据库以查找非常大的键。
  • 带模式匹配的键空间扫描器。
  • 作为发布/订阅客户端订阅频道。
  • 监视Redis实例中执行的命令。
  • 以不同方式检查Redis服务器的延迟
  • 检查本地计算机的调度器延迟。
  • 将RDB备份从远程Redis服务器传输到本地。
  • 作为Redis副本,显示副本接收到的内容。
  • 模拟LRU 工作负载,显示关于键命中的统计信息。
  • Lua调试器的客户端。

连续统计模式

连续统计模式可能是redis-cli 中不太为人所知但非常有用的功能之一,用于实时监视Redis实例。要启用此模式,请使用--stat 选项。此模式下CLI的行为输出非常清晰

$ redis-cli --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-cli 工具,可以轻松了解连接的Redis数据库的内存使用情况、客户端连接数以及各种其他统计信息。

在这种情况下,-i <interval> 选项作为修饰符,用于更改新行发出的频率。默认值是一秒。

扫描大键和内存使用情况

大键

在此特殊模式下,redis-cli 作为键空间分析器工作。它扫描数据集以查找大键,还提供数据集组成的数据类型信息。使用--bigkeys 选项启用此模式,并生成详细输出

$ redis-cli --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).

100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Keys sampled: 55

-------- summary -------

Total key length in bytes is 495 (avg len 9.00)

Biggest   list found "bikes:finished" has 1 items
Biggest string found "all_bikes" has 36 bytes
Biggest   hash found "bike:1:stats" has 3 fields
Biggest stream found "race:france" has 4 entries
Biggest    set found "bikes:racing:france" has 3 members
Biggest   zset found "racer_scores" has 8 members

1 lists with 1 items (01.82% of keys, avg size 1.00)
16 strings with 149 bytes (29.09% of keys, avg size 9.31)
1 MBbloomCFs with 0 ? (01.82% of keys, avg size 0.00)
1 hashs with 3 fields (01.82% of keys, avg size 3.00)
3 streams with 8 entries (05.45% of keys, avg size 2.67)
2 TDIS-TYPEs with 0 ? (03.64% of keys, avg size 0.00)
1 TopK-TYPEs with 0 ? (01.82% of keys, avg size 0.00)
2 sets with 5 members (03.64% of keys, avg size 2.50)
1 CMSk-TYPEs with 0 ? (01.82% of keys, avg size 0.00)
2 zsets with 11 members (03.64% of keys, avg size 5.50)
25 ReJSON-RLs with 0 ? (45.45% of keys, avg size 0.00)

在输出的第一部分,报告了遇到的每个比前一个同类型的大键更大的新键。摘要部分提供了Redis实例内部数据的总体统计信息。

该程序使用SCAN 命令,因此可以在繁忙的服务器上执行而不会影响操作,但是可以使用-i 选项来限制每个SCAN 命令的扫描过程,指定每次扫描的秒数比例进行节流。

例如,-i 0.01 将显著减慢程序执行速度,但也会将服务器负载降低到可以忽略的程度。

请注意,摘要还以更清晰的形式报告了每次找到的最大键。如果针对非常大的数据集运行,初始输出仅是为了尽快提供一些有趣的信息。

--bigkeys 选项现在可在集群副本上使用。

内存使用情况

--bigkeys 选项类似,--memkeys 允许您扫描整个键空间以查找最大键以及每种键类型的平均大小。

$ redis-cli --memkeys

# 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).

100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Keys sampled: 55

-------- summary -------

Total key length in bytes is 495 (avg len 9.00)

Biggest   list found "bikes:finished" has 104 bytes
Biggest string found "all_bikes" has 120 bytes
Biggest MBbloomCF found "bikes:models" has 1048680 bytes
Biggest   hash found "bike:1:stats" has 104 bytes
Biggest stream found "race:italy" has 7172 bytes
Biggest TDIS-TYPE found "bikes:sales" has 9832 bytes
Biggest TopK-TYPE found "bikes:keywords" has 114256 bytes
Biggest    set found "bikes:racing:france" has 120 bytes
Biggest CMSk-TYPE found "bikes:profit" has 144056 bytes
Biggest   zset found "racer_scores" has 168 bytes
Biggest ReJSON-RL found "bikes:inventory" has 4865 bytes

1 lists with 104 bytes (01.82% of keys, avg size 104.00)
16 strings with 1360 bytes (29.09% of keys, avg size 85.00)
1 MBbloomCFs with 1048680 bytes (01.82% of keys, avg size 1048680.00)
1 hashs with 104 bytes (01.82% of keys, avg size 104.00)
3 streams with 16960 bytes (05.45% of keys, avg size 5653.33)
2 TDIS-TYPEs with 19648 bytes (03.64% of keys, avg size 9824.00)
1 TopK-TYPEs with 114256 bytes (01.82% of keys, avg size 114256.00)
2 sets with 208 bytes (03.64% of keys, avg size 104.00)
1 CMSk-TYPEs with 144056 bytes (01.82% of keys, avg size 144056.00)
2 zsets with 304 bytes (03.64% of keys, avg size 152.00)
25 ReJSON-RLs with 15748 bytes (45.45% of keys, avg size 629.92)

--memkeys 选项现在可在集群副本上使用。

结合使用--bigkeys--memkeys

您可以使用--keystats--keystats-samples 选项,结合--memkeys--bigkeys 并提供额外的分布数据。

$ redis-cli --keystats

# Scanning the entire keyspace to find the biggest keys and distribution information.
# Use -i 0.1 to sleep 0.1 sec per 100 SCAN commands (not usually needed).
# Use --cursor <n> to start the scan at the cursor <n> (usually after a Ctrl-C).
# Use --top <n> to display <n> top key sizes (default is 10).
# Ctrl-C to stop the scan.

100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Keys sampled: 55
Keys size:    1.30M

--- Top 10 key sizes ---
  1    1.00M MBbloomCF  "bikes:models"
  2  140.68K CMSk-TYPE  "bikes:profit"
  3  111.58K TopK-TYPE  "bikes:keywords"
  4    9.60K TDIS-TYPE  "bikes:sales"
  5    9.59K TDIS-TYPE  "racer_ages"
  6    7.00K stream     "race:italy"
  7    4.92K stream     "race:france"
  8    4.75K ReJSON-RL  "bikes:inventory"
  9    4.64K stream     "race:usa"
 10    1.26K ReJSON-RL  "bicycle:7"

--- Top size per type ---
list       bikes:finished is 104B
string     all_bikes is 120B
MBbloomCF  bikes:models is 1.00M
hash       bike:1:stats is 104B
stream     race:italy is 7.00K
TDIS-TYPE  bikes:sales is 9.60K
TopK-TYPE  bikes:keywords is 111.58K
set        bikes:racing:france is 120B
CMSk-TYPE  bikes:profit is 140.68K
zset       racer_scores is 168B
ReJSON-RL  bikes:inventory is 4.75K

--- Top length and cardinality per type ---
list       bikes:finished has 1 items
string     all_bikes has 36B
hash       bike:1:stats has 3 fields
stream     race:france has 4 entries
set        bikes:racing:france has 3 members
zset       racer_scores has 8 members

Key size Percentile Total keys
-------- ---------- -----------
     64B    0.0000%           3
    239B   50.0000%          28
    763B   75.0000%          42
   4.92K   87.5000%          49
   9.60K   93.7500%          52
 140.69K   96.8750%          54
   1.00M  100.0000%          55
Note: 0.01% size precision, Mean: 24.17K, StdDeviation: 138.12K

Key name length Percentile Total keys
--------------- ---------- -----------
            19B  100.0000%          55
Total key length is 495B (9B avg)

Type        Total keys  Keys % Tot size Avg size  Total length/card Avg ln/card
--------- ------------ ------- -------- -------- ------------------ -----------
list                 1   1.82%     104B     104B            1 items        1.00
string              16  29.09%    1.33K      85B               149B          9B
MBbloomCF            1   1.82%    1.00M    1.00M                 -           - 
hash                 1   1.82%     104B     104B           3 fields        3.00
stream               3   5.45%   16.56K    5.52K          8 entries        2.67
TDIS-TYPE            2   3.64%   19.19K    9.59K                 -           - 
TopK-TYPE            1   1.82%  111.58K  111.58K                 -           - 
set                  2   3.64%     208B     104B          5 members        2.50
CMSk-TYPE            1   1.82%  140.68K  140.68K                 -           - 
zset                 2   3.64%     304B     152B         11 members        5.50
ReJSON-RL           25  45.45%   15.38K     629B                 -           - 

获取键列表

也可以扫描键空间,同样以一种不会阻塞Redis服务器的方式(使用KEYS * 命令会阻塞),并打印所有键名,或根据特定模式过滤它们。此模式与--bigkeys 选项一样,使用SCAN 命令,因此如果数据集正在更改,键可能会多次报告,但如果某个键自迭代开始就存在,则不会丢失。由于使用的命令,此选项称为--scan

$ redis-cli --scan | head -10
key-419
key-71
key-236
key-50
key-38
key-458
key-453
key-499
key-446
key-371

请注意,使用head -10 是为了仅打印输出的前十行。

扫描能够通过--pattern 选项使用SCAN 命令的基础模式匹配能力。

$ redis-cli --scan --pattern '*-11*'
key-114
key-117
key-118
key-113
key-115
key-112
key-119
key-11
key-111
key-110
key-116

通过管道将输出传输到wc 命令可以根据键名统计特定类型的对象

$ redis-cli --scan --pattern 'user:*' | wc -l
3829433

您可以使用-i 0.01 在调用SCAN 命令之间添加延迟。这将使命令变慢,但会显著减少服务器负载。

发布/订阅模式

CLI能够使用PUBLISH 命令在Redis发布/订阅频道中发布消息。订阅频道以接收消息则不同 - 终端会被阻塞并等待消息,因此这在redis-cli 中作为一种特殊模式实现。与其他特殊模式不同,此模式不是通过特殊选项启用,而是简单地通过使用SUBSCRIBEPSUBSCRIBE 命令启用,这些命令在交互模式或命令模式下都可用

$ redis-cli PSUBSCRIBE '*'
Reading messages... (press Ctrl-C to quit)
1) "PSUBSCRIBE"
2) "*"
3) (integer) 1

reading messages 消息表明我们进入了发布/订阅模式。当另一个客户端在某个频道发布消息时,例如使用命令redis-cli PUBLISH mychannel mymessage,处于发布/订阅模式的CLI将显示如下内容

1) "pmessage"
2) "*"
3) "mychannel"
4) "mymessage"

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

监视在Redis中执行的命令

与发布/订阅模式类似,一旦使用MONITOR 命令,就会自动进入监视模式。活动Redis实例接收到的所有命令都将打印到标准输出

$ redis-cli MONITOR
OK
1460100081.165665 [0 127.0.0.1:51706] "set" "shipment:8000736522714:status" "sorting"
1460100083.053365 [0 127.0.0.1:51707] "get" "shipment:8000736522714:status"

请注意,可以对输出进行管道操作,因此您可以使用grep 等工具监视特定模式。

监视Redis实例的延迟

Redis经常用于延迟非常关键的场景。延迟涉及应用程序内部的多个移动部分,从客户端库到网络堆栈,再到Redis实例本身。

redis-cli 具有多种工具用于研究Redis实例的延迟并了解延迟的最大值、平均值和分布情况。

基本的延迟检查工具是--latency 选项。使用此选项,CLI会运行一个循环,向Redis实例发送PING 命令并测量接收回复所需的时间。这每秒发生100次,统计信息实时更新在控制台中

$ redis-cli --latency
min: 0, max: 1, avg: 0.19 (427 samples)

统计信息以毫秒为单位提供。通常,由于运行redis-cli 本身的系统内核调度器造成的延迟,一个非常快的实例的平均延迟往往会被高估一点,所以上面0.19的平均延迟很容易就是0.01或更少。然而,这通常不是一个大问题,因为大多数开发者对几毫秒或更长的事件感兴趣。

有时,研究最大和平均延迟随时间演变的情况很有用。--latency-history 选项用于此目的:它的工作原理与--latency 完全相同,但每隔15秒(默认)就会重新开始一个新的采样会话

$ redis-cli --latency-history
min: 0, max: 1, avg: 0.14 (1314 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.18 (1299 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.20 (113 samples)^C

采样会话的长度可以使用-i <interval> 选项更改。

最先进的延迟研究工具,但对于非经验用户来说也是最难解释的,是使用彩色终端显示延迟频谱的能力。您会看到彩色输出,指示样本的不同百分比,以及指示不同延迟数值的不同ASCII字符。使用--latency-dist 选项启用此模式

$ redis-cli --latency-dist
(output not displayed, requires a color terminal, try it!)

redis-cli 内部还实现了一个相当不寻常的延迟工具。它不检查Redis实例的延迟,而是检查运行redis-cli 的计算机的延迟。这种延迟是内核调度器、虚拟化实例中的管理程序等固有造成的。

Redis称之为固有延迟,因为它对程序员来说大部分是透明的。如果Redis实例延迟很高,而不管所有明显的可能原因,那么值得在运行Redis服务器的系统上直接运行redis-cli 的此特殊模式来检查您的系统能做到最好是什么。

通过测量固有延迟,您就知道这是基线,Redis不可能超越您的系统。要在此模式下运行CLI,请使用--intrinsic-latency <test-time>。请注意,测试时间以秒为单位,决定了测试运行的时间长度。

$ ./redis-cli --intrinsic-latency 5
Max latency so far: 1 microseconds.
Max latency so far: 7 microseconds.
Max latency so far: 9 microseconds.
Max latency so far: 11 microseconds.
Max latency so far: 13 microseconds.
Max latency so far: 15 microseconds.
Max latency so far: 34 microseconds.
Max latency so far: 82 microseconds.
Max latency so far: 586 microseconds.
Max latency so far: 739 microseconds.

65433042 total runs (avg latency: 0.0764 microseconds / 764.14 nanoseconds per run).
Worst run took 9671x longer than the average latency.

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

在上述情况下,系统的最差延迟不能优于739微秒,因此可以预期某些查询偶尔会运行不到1毫秒。

远程备份RDB文件

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

$ redis-cli --rdb /tmp/dump.rdb
SYNC sent to master, writing 13256 bytes to '/tmp/dump.rdb'
Transfer finished with success.

这是一种简单而有效的方法,可以确保您的Redis实例存在灾难恢复RDB备份。在脚本或cron 作业中使用此选项时,请务必检查命令的返回值。如果返回值非零,则表示发生错误,如下例所示

$ redis-cli --rdb /tmp/dump.rdb
SYNC with master failed: -ERR Can't SYNC while not connected with my master
$ echo $?
1

副本模式

CLI的副本模式是一个高级功能,对Redis开发者和调试操作很有用。它允许检查主服务器在复制流中发送给副本的内容,以便将写入传播到副本。选项名称很简单,就是--replica。以下是一个可行的示例

$ redis-cli --replica
SYNC with master, discarding 13256 bytes of bulk transfer...
SYNC done. Logging commands from master.
"PING"
"SELECT","0"
"SET","last_name","Enigk"
"PING"
"INCR","mycounter"

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

如果您认为某些命令在您的副本中没有正确复制,这是一个检查情况的好方法,也是改进错误报告的有用信息。

执行 LRU 模拟

Redis 通常用作带有 LRU 逐出 的缓存。根据键的数量以及为缓存分配的内存量(通过 maxmemory 指令指定),缓存的命中率和未命中率将发生变化。有时,模拟命中率对于正确配置缓存非常有用。

redis-cli 有一个特殊模式,可以模拟 GET 和 SET 操作,使用请求模式中的 80-20% 幂律分布。这意味着 20% 的键将被请求 80% 的时间,这是缓存场景中常见的分布。

理论上,考虑到请求分布和 Redis 内存开销,应该可以用数学公式解析计算出命中率。然而,Redis 可以配置不同的 LRU 设置(样本数量),而且 Redis 中近似实现的 LRU 在不同版本之间变化很大。同样,每个键的内存量在不同版本之间也可能发生变化。这就是构建此工具的原因:其主要动机是为了测试 Redis LRU 实现的质量,但现在也可用于测试给定版本在使用最初用于部署的设置时的表现如何。

要使用此模式,请指定测试中的键数量,并首先配置一个合理的 maxmemory 设置。

重要提示:在 Redis 配置中配置 maxmemory 设置至关重要:如果没有设置最大内存使用上限,命中率最终将达到 100%,因为所有键都可以存储在内存中。如果指定了过多的键但设置了最大内存,最终将用尽计算机的所有 RAM。还需要配置适当的 maxmemory policy;大多数情况下选择 allkeys-lru

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

警告:此测试使用管道(pipelining)并且会对服务器造成压力,请勿在生产实例上使用。

$ ./redis-cli --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%)

程序每秒显示统计数据。在最初几秒钟,缓存开始填充。未命中率随后稳定在预期的实际数值上

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 内存不足。观察一个使用半吉字节内存的示例。几分钟后,输出稳定在以下数值

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 模式)有足够的空间。

评价本页
回到顶部 ↑