Redis CLI
提示
来自deepseek解释
原文链接:https://redis.io/docs/latest/develop/tools/cli/
在交互模式下,redis-cli 具有基本的行编辑功能,提供熟悉的输入体验。
要以特殊模式启动程序,可以使用多个选项,包括:
- 模拟副本并打印从主节点接收的复制流。
- 检查 Redis 服务器的延迟并显示统计信息。
- 请求延迟样本和频率的 ASCII 艺术频谱图。
本主题涵盖 redis-cli 的不同方面,从最简单的开始,到更高级的功能结束。
安装 redis-cli
您有多个安装或使用 redis-cli 的选项。
安装 Redis 开源版。
redis-cli工具作为每种安装方法的一部分安装。从源码构建 Redis。不必构建所有内容,只需运行以下命令:
$ make redis-cliredis-cli工具将在/path/to/redis-source/src目录中构建为/path/to/redis-source/src/redis-cli。
如果您不想安装 Redis,也可以在 Docker 中运行 redis-cli。请参阅使用 Docker 运行 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%40ssw0rd@redis-16379.hosted.com:16379/0 PING
PONG
注意: 用户名、密码和 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
... 每秒打印一行新内容 ...
使用 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-cli 对使用 Lua 脚本的调试功能有广泛支持,该功能从 Redis 3.2 起可用。有关此功能,请参阅 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>
(现在我们重新连接了)
当执行重连时,redis-cli 会自动重新选择上次选择的数据库编号。但是,有关连接的所有其他状态都会丢失,例如在 MULTI/EXEC 事务中:
$ redis-cli
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> PING
QUEUED
(这里服务器被手动重启)
127.0.0.1:6379> EXEC
(error) ERR EXEC without MULTI
在交互模式下使用 redis-cli 进行测试时,这通常不是问题,但应了解此限制。
使用 -t <timeout> 选项以秒为单位指定服务器超时时间。
编辑、历史、补全和提示
因为 redis-cli 使用 linenoise 行编辑库,它始终具有行编辑功能,不依赖于 libreadline 或其他可选库。
可以通过按方向键(上、下)访问命令执行历史,避免重新输入命令。 历史记录在 CLI 重启之间保留在用户主目录(由 HOME 环境变量指定)下的 .rediscli_history 文件中。可以通过设置 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 8.8 开始,redis-cli 支持单词跳转导航(Alt/Option + ←/→,Ctrl + ←/→),这使得编辑长命令更加高效。
偏好设置
有两种方式可以自定义 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>显示给定类别的所有命令。类别包括:@generic@string@list@set@sorted_set@hash@pubsub@transactions@connection@server@scripting@hyperloglog@cluster@geo@stream
HELP <commandname>显示作为参数给出的命令的特定帮助。
例如,要显示 PFADD 命令的帮助,请使用:
127.0.0.1:6379> HELP PFADD
PFADD key element [element ...]
summary: 将指定元素添加到指定的 HyperLogLog 中。
since: 2.8.9
请注意,HELP 也支持 TAB 补全。
清空终端屏幕
在交互模式下使用 CLEAR 命令可以清空终端屏幕。
特殊操作模式
到目前为止,我们看到了 redis-cli 的两种主要模式。
- Redis 命令的命令行执行。
- 交互式 "REPL" 使用。
CLI 还执行与 Redis 相关的其他辅助任务,将在下一节中解释:
- 显示 Redis 服务器持续统计信息的监控工具。
- 扫描 Redis 数据库以查找非常大的键。
- 支持模式匹配的键空间扫描器。
- 充当 Pub/Sub 客户端以订阅频道。
- 监控 Redis 实例中执行的命令。
- 以不同方式检查 Redis 服务器的延迟。
- 检查本地计算机的调度器延迟。
- 将远程 Redis 服务器的 RDB 备份传输到本地。
- 充当 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> 选项用作修饰符,以更改新行发出的频率。默认值为 1 秒。
扫描大键和内存使用
大键
在这种特殊模式下,redis-cli 充当键空间分析器。它扫描数据集以查找大键,同时还提供有关数据集包含的数据类型的信息。此模式通过 --bigkeys 选项启用,并产生详细输出:
$ redis-cli --bigkeys
# 正在扫描整个键空间以查找最大的键以及
# 每种键类型的平均大小。您可以使用 -i 0.1 每 100 条 SCAN 命令休眠 0.1 秒(通常不需要)。
100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样键数:55
-------- 摘要 -------
总键长度字节数为 495(平均长度 9.00)
... 输出已截断 ...
1 个哈希包含 3 个字段(占键的 01.82%,平均大小 3.00)
3 个流包含 8 个条目(占键的 05.45%,平均大小 2.67)
2 个 TDIS-TYPE 包含 0 ?(占键的 03.64%,平均大小 0.00)
1 个 TopK-TYPE 包含 0 ?(占键的 01.82%,平均大小 0.00)
2 个集合包含 5 个成员(占键的 03.64%,平均大小 2.50)
1 个 CMSk-TYPE 包含 0 ?(占键的 01.82%,平均大小 0.00)
2 个有序集合包含 11 个成员(占键的 03.64%,平均大小 5.50)
25 个 ReJSON-RL 包含 0 ?(占键的 45.45%,平均大小 0.00)
在输出的第一部分,会报告每个新遇到的大于之前(同类型)大键的键。摘要部分提供有关 Redis 实例内部数据的一般统计信息。
该程序使用 SCAN 命令,因此可以在繁忙的服务器上执行而不影响操作,但是可以使用 -i 选项来限制扫描过程,为每条 SCAN 命令指定休眠的秒数。
例如,-i 0.01 将大大减慢程序执行速度,但也会将服务器负载降低到可忽略的程度。
请注意,摘要还会以更清晰的形式报告每次找到的最大键。最初的输出只是为了在针对非常大的数据集运行时尽快提供一些有趣的信息。
--bigkeys 选项现在可以在集群副本上工作。
内存使用
与 --bigkeys 选项类似,--memkeys 允许您扫描整个键空间以查找最大的键以及每种键类型的平均大小。
$ redis-cli --memkeys
# 正在扫描整个键空间以查找最大的键以及
# 每种键类型的平均大小。您可以使用 -i 0.1 每 100 条 SCAN 命令休眠 0.1 秒(通常不需要)。
100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样键数:55
-------- 摘要 -------
总键长度字节数为 495(平均长度 9.00)
... 输出已截断 ...
1 个哈希占用 104 字节(占键的 01.82%,平均大小 104.00)
3 个流占用 16960 字节(占键的 05.45%,平均大小 5653.33)
2 个 TDIS-TYPE 占用 19648 字节(占键的 03.64%,平均大小 9824.00)
1 个 TopK-TYPE 占用 114256 字节(占键的 01.82%,平均大小 114256.00)
2 个集合占用 208 字节(占键的 03.64%,平均大小 104.00)
1 个 CMSk-TYPE 占用 144056 字节(占键的 01.82%,平均大小 144056.00)
2 个有序集合占用 304 字节(占键的 03.64%,平均大小 152.00)
25 个 ReJSON-RL 占用 15748 字节(占键的 45.45%,平均大小 629.92)
--memkeys 选项现在可以在集群副本上工作。
组合 --bigkeys 和 --memkeys
您可以使用 --keystats 和 --keystats-samples 选项将 --memkeys 和 --bigkeys 与额外的分布数据结合起来。
$ redis-cli --keystats
# 正在扫描整个键空间以查找最大的键和分布信息。
# 使用 -i 0.1 每 100 条 SCAN 命令休眠 0.1 秒(通常不需要)。
# 使用 --cursor <n> 从游标 <n> 开始扫描(通常在按 Ctrl-C 之后)。
# 使用 --top <n> 显示 <n> 个最大的键大小(默认 10)。
# 按 Ctrl-C 停止扫描。
100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样键数:55
键大小: 1.30M
--- 前 10 个键大小 ---
1 1.00M MBbloomCF "bikes:models"
... 输出已截断 ...
--------- ------------ ------- -------- -------- ------------------ -----------
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 仅打印输出的前 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 Pub/Sub 频道中发布消息。订阅频道以接收消息则不同——终端会被阻塞并等待消息,因此在 redis-cli 中作为一个特殊模式实现。与其他特殊模式不同,此模式不是通过特殊选项启用的,而是通过使用 SUBSCRIBE 或 PSUBSCRIBE 命令,这些命令在交互模式或命令模式下都可用:
$ redis-cli PSUBSCRIBE '*'
Reading messages... (press Ctrl-C to quit)
1) "PSUBSCRIBE"
2) "*"
3) (integer) 1
Reading messages 消息表示我们已进入 Pub/Sub 模式。 当另一个客户端在某个频道发布消息时,例如使用命令 redis-cli PUBLISH mychannel mymessage,Pub/Sub 模式下的 CLI 将显示类似:
1) "pmessage"
2) "*"
3) "mychannel"
4) "mymessage"
这对于调试 Pub/Sub 问题非常有用。 要退出 Pub/Sub 模式,只需按 CTRL-C。
监控 Redis 中执行的命令
与 Pub/Sub 模式类似,一旦使用 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
(输出未显示,需要彩色终端,请亲自尝试!)
redis-cli 中还有另一个相当不寻常的延迟工具。它不检查 Redis 实例的延迟,而是检查运行 redis-cli 的计算机的延迟。这种延迟本质上是内核调度器、虚拟化实例中的 hypervisor 等引起的延迟。
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 策略;大多数情况下选择 allkeys-lru。
在以下示例中,配置了 100MB 的内存限制,并使用 1000 万个键进行 LRU 模拟。
警告:该测试使用管道,会对服务器造成压力,请勿在生产实例上使用。
$ ./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 内存不够。观察一个使用 512MB 内存的示例。几分钟后输出稳定到以下数字:
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%)
对于键数量(1000 万)和分布(80-20 风格),500MB 提供了足够的空间。
用法
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]选项:
-h <hostname>:服务器主机名(默认:127.0.0.1)。-p <port>:服务器端口(默认:6379)。-t <timeout>:服务器连接超时时间(秒,允许小数)。默认超时为 0,表示无限制,取决于操作系统。-s <socket>:服务器套接字(覆盖主机名和端口)。-a <password>:连接服务器时使用的密码。您也可以使用 REDISCLI_AUTH 环境变量更安全地传递此密码(如果两者都使用,此参数优先)。--user <username>:用于发送 ACL 样式的 'AUTH username pass'。需要 -a。--pass <password>:-a 的别名,以与新的 --user 选项保持一致。--askpass:强制用户从 STDIN 输入带掩码的密码。如果使用此参数,将忽略 '-a' 和 REDISCLI_AUTH 环境变量。-u <uri>:格式为 redis://user:password@host:port/dbnum 的服务器 URI。用户名、密码和 dbnum 是可选的。对于无用户名的身份验证,请使用用户名 'default'。对于 TLS,请使用方案 'rediss'。-r <repeat>:执行指定命令 N 次。-i <interval>:当使用 -r 时,每条命令等待<interval>秒。可以指定亚秒级时间,如 -i 0.1。此间隔也用于 --scan 和 --stat 的每个周期,以及 --bigkeys、--memkeys、--keystats 和 --hotkeys 的每 100 个周期。-n <db>:数据库编号。-2:以 RESP2 协议模式启动会话。-3:以 RESP3 协议模式启动会话。-x:从 STDIN 读取最后一个参数(见下面的示例)。-X:从 STDIN 读取<tag>参数(见下面的示例)。-d <delimiter>:原始格式响应块之间的分隔符(默认:\n)。-D <delimiter>:原始格式响应之间的分隔符(默认:\n)。-c:启用集群模式(遵循 -ASK 和 -MOVED 重定向)。-e:命令执行失败时返回退出错误码。-4:DNS 查找时优先使用 IPv4 而非 IPv6。-6:DNS 查找时优先使用 IPv6 而非 IPv4。--raw:对回复使用原始格式(当 STDOUT 不是 tty 时默认)。--no-raw:即使 STDOUT 不是 tty 也强制格式化输出。--quoted-input:强制将输入视为引用字符串。--csv:以 CSV 格式输出。--json:以 JSON 格式输出(默认 RESP3,如果要在 RESP2 中使用,请使用 -2)。--quoted-json:与 --json 相同,但生成 ASCII 安全的引用字符串,而非 Unicode。--show-pushes <yn>:是否打印 RESP3 PUSH 消息。当 STDOUT 是 tty 时默认启用,但可以通过 --show-pushes no 覆盖。--stat:打印关于服务器的滚动统计信息:内存、客户端等。--latency:进入连续采样延迟的特殊模式。如果在交互式会话中使用此模式,它将永远运行并显示实时统计信息。否则,如果指定了 --raw 或 --csv,或者将输出重定向到非 TTY,它将采样延迟 1 秒(可以使用 -i 更改间隔),然后产生单个输出并退出。--latency-history:类似于 --latency,但跟踪延迟随时间的变化。默认时间间隔为 15 秒。使用 -i 更改。--latency-dist:以频谱形式显示延迟,需要 xterm 256 色。默认时间间隔为 1 秒。使用 -i 更改。--lru-test <keys>:使用 80-20 分布模拟缓存工作负载。--replica:模拟副本,显示从主节点接收的命令。--rdb <filename>:将 RDB 转储从远程服务器传输到本地文件。使用文件名 "-" 写入标准输出。--functions-rdb <filename>:类似于 --rdb,但仅获取函数(而非键)作为 RDB 转储文件。--pipe:将原始 Redis 协议从 stdin 传输到服务器。--pipe-timeout <n>:在 --pipe 模式下,如果发送所有数据后,在<n>秒内未收到回复,则中止并报错。默认超时:30。使用 0 表示永远等待。--bigkeys:采样 Redis 键,查找具有许多元素(复杂度)的键。--memkeys:采样 Redis 键,查找消耗大量内存的键。--memkeys-samples <n>:采样 Redis 键,查找消耗大量内存的键。并定义要采样的键元素数量。--keystats:采样 Redis 键,查找键内存大小和长度(结合 bigkeys 和 memkeys)。--keystats-samples <n>:采样 Redis 键,查找键内存大小和长度。并定义要采样的键元素数量(仅用于内存使用)。--cursor <n>:从游标<n>开始扫描(通常在按 Ctrl-C 之后)。可选用于 --keystats 和 --keystats-samples。--top <n>:显示<n>个最大的键大小(默认:10)。可选用于 --keystats 和 --keystats-samples。--hotkeys:采样 Redis 键,查找热键。仅在 maxmemory-policy 为 *lfu 时有效。--scan:使用 SCAN 命令列出所有键。--pattern <pat>:使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 选项时的键模式(默认:*)。--count <count>:使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 时的计数选项(默认:10)。--quoted-pattern <pat>:与 --pattern 相同,但指定的字符串可以被引用,以传递否则不安全的二进制字符串。--intrinsic-latency <sec>:运行测试以测量固有系统延迟。测试将运行指定的秒数。--eval <file>:使用位于<file>的 Lua 脚本发送 EVAL 命令。--ldb:与 --eval 一起使用,启用 Redis Lua 调试器。--ldb-sync-mode:类似于 --ldb,但使用同步 Lua 调试器,在此模式下服务器被阻塞,脚本更改不会从服务器内存中回滚。--cluster <command> [args...] [opts...]:集群管理器命令和参数(见下文)。--verbose:详细模式。--no-auth-warning:在命令行界面上使用密码时不显示警告消息。--help:显示此帮助并退出。--version:显示版本并退出。
集群管理器命令
使用 --cluster help 列出所有可用的集群管理器命令。
示例
redis-cli -u redis://default:PASSWORD@localhost:6379/0cat /etc/passwd | redis-cli -x set mypasswdredis-cli -D "" --raw dump key > key.dump && redis-cli -X dump_tag restore key2 0 dump_tag replace < key.dumpredis-cli -r 100 lpush mylist xredis-cli -r 100 -i 1 info | grep used_memory_human:redis-cli --quoted-input set '"null-\x00-separated"' valueredis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3redis-cli --scan --pattern '*:12345*'redis-cli --scan --pattern '*:12345*' --count 100(注意:使用 --eval 时,逗号分隔 KEYS[] 和 ARGV[] 项)
当未给出命令时,redis-cli 以交互模式启动。在交互模式下键入 "help" 可获取有关可用命令和设置的信息。