Redis CLI
Redis 命令行界面 redis-cli 的概述
在交互模式下,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%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
... 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
标志只适用于单个命令,而不是整个 DB 作为导出。
运行 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>
(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>
显示有关给定类别的所有命令。类别为@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: 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.01 to sleep 0.01 sec
# per SCAN command (not usually needed).
[00.00%] Biggest string found so far 'key-419' with 3 bytes
[05.14%] Biggest list found so far 'mylist' with 100004 items
[35.77%] Biggest string found so far 'counter:__rand_int__' with 6 bytes
[73.91%] Biggest hash found so far 'myobject' with 3 fields
-------- summary -------
Sampled 506 keys in the keyspace!
Total key length in bytes is 3452 (avg len 6.82)
Biggest string found 'counter:__rand_int__' has 6 bytes
Biggest list found 'mylist' has 100004 items
Biggest hash found 'myobject' has 3 fields
504 strings with 1403 bytes (99.60% of keys, avg size 2.78)
1 lists with 100004 items (00.20% of keys, avg size 100004.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
1 hashs with 3 fields (00.20% of keys, avg size 3.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
在输出的第一部分中,将报告遇到的每个大于前一个更大键(相同类型)的新键。摘要部分提供了有关 Redis 实例内数据的总体统计信息。
该程序使用 SCAN
命令,因此可以在繁忙的服务器上对其执行,而不会影响操作,但是可以使用 `-i` 选项以每秒的指定部分来限制扫描过程 SCAN
命令。
例如,`-i 0.01` 将显着减慢程序执行速度,但也会将服务器上的负载减少到可以忽略不计的程度。
请注意,摘要还以更清晰的形式报告了每个时间找到的最大键。初始输出只是为了在针对非常大的数据集运行时尽快提供一些有趣的信息。
--bigkeys
选项现在适用于集群副本。
内存使用情况
与 `--bigkeys` 选项类似,`--memkeys` 允许您扫描整个键空间以查找最大键以及每种键类型的平均大小。
--memkeys
选项现在适用于集群副本。
结合 `--bigkeys` 和 `--memkeys`
您可以使用 `--keystats` 和 `--keystats-samples` 选项将 `--memkeys` 和 `--bigkeys` 与其他分布数据结合起来。
获取键列表
还可以以一种不会阻塞 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` 用于仅打印输出的前十行。
扫描能够使用 SCAN
命令的底层模式匹配功能,并使用 `--pattern` 选项。
$ 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` 中实现为特殊模式。与其他特殊模式不同,此模式不是通过使用特殊选项启用的,而是简单地使用 SUBSCRIBE
或 PSUBSCRIBE
命令,这些命令在交互模式或命令模式下可用。
$ redis-cli PSUBSCRIBE '*'
Reading messages... (press Ctrl-C to quit)
1) "PSUBSCRIBE"
2) "*"
3) (integer) 1
“读取消息”消息表明我们已进入发布/订阅模式。当另一个客户端在某个通道中发布某些消息时,例如使用 `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 运行一个循环,其中 PING
命令发送到 Redis 实例,并测量接收回复的时间。每秒发生 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-cli` 时可以做到的最好成绩,直接在您运行 Redis 服务器的系统上运行此特殊模式。
通过测量内在延迟,您就知道这是基线,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 的内存并不足够。观察使用 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 样式)。