Redis的CLI
Redis-cli的概述,Redis的命令行界面
在交互式模式下,redis-cli
具有基本的行编辑能力,提供熟悉的打字体验。
要在特殊模式下启动程序,你可以使用几个选项,包括:
- 模拟副本并打印它从主副本接收的复制流。
- 检查 Redis 服务器的延迟并显示统计信息。
- 请求延迟样本和频率的ASCII-art频谱图。
本主题涵盖了redis-cli
的不同方面,从最简单的开始,到更高级的功能结束。
命令行的使用方法
要运行Redis命令并在终端返回标准输出,请将要执行的命令作为redis-cli
的单独参数包括进来:
$ redis-cli INCR mycounter
(integer) 7
该命令的回复是"7"。由于Redis的回复是类型化的(字符串、数组、整数、nil、错误等),你可以在括号里看到回复的类型。当redis-cli
的输出必须被用作另一个命令的输入或被重定向到一个文件时,这种额外的信息可能并不理想。
redis-cli
只在它检测到标准输出是tty或终端时显示额外的信息,以便于人类阅读。对于所有其他的输出,它将自动启用raw输出模式,如下面的例子:
$ 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>
选项,发送一条对数据库编号进行操作的命令,而不是默认的数字0:
$ 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
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服务器实例的主机名和端口。
当连接的服务器发生变化时,或者在与数据库编号为0不同的数据库上操作时,提示会更新:
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
进行测试时,这通常不是一个问题,但这个限制应该被知道。
编辑、历史、完成度和提示
因为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
偏好设置打开或关闭。
首选条件
有两种方法可以自定义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
为大多数Redis 命令提供在线帮助,使用HELP
命令。该命令可以以两种形式使用:
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数据库,寻找非常大的键。
- 具有模式匹配的键空间扫描器。
- 充当Pub/Sub客户端,以订阅频道。
- 监控执行到Redis实例中的命令。
- 以不同的方式检查Redis服务器的latency。
- 检查本地计算机的调度程序延迟。
- 从本地远程 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>
选项作为修改器发挥作用,以改变新行发出的频率。默认是一秒钟。
扫描大键
在这种特殊模式下,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
会大大降低程序的执行速度,但也会将服务器的负载降低到可以忽略不计的程度。
请注意,摘要还以更简洁的形式报告了每次发现的最大键。最初的输出只是为了在针对一个非常大的数据集运行时尽快提供一些有趣的信息。
获取键列表
也可以扫描键空间,同样是以不阻塞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 Pub/Sub通道中发布消息。为了接收消息而订阅通道是不同的--终端被封锁并等待消息,所以这在redis-cli
中被实现为一种特殊模式。与其他特殊模式不同的是,这种模式不是通过使用特殊选项来启用的,而只是通过使用SUBSCRIBE
或PSUBSCRIBE
命令来启用,这些命令在交互式或命令式模式下都可以使用:
$ redis-cli PSUBSCRIBE '*'
Reading messages... (press Ctrl-C to quit)
1) "PSUBSCRIBE"
2) "*"
3) (integer) 1
读消息消息显示我们进入了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运行一个循环,在这个循环中,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服务器的系统中直接以这种特殊模式运行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
所利用,以便提供一个远程备份工具,允许从任何Redis实例向运行redis-cli
的本地计算机传输RDB文件。要使用这种模式,请用--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设置(样本数),而且LRU的实现(在Redis中是近似的)在不同的版本之间变化很大。同样,每个键的内存量在不同的版本之间也会发生变化。这就是建立这个工具的原因:它的主要动机是测试Redis的LRU实现的质量,但现在也可以用来测试一个给定的版本在最初用于部署的设置下是如何表现的。
要使用这种模式,要指定测试中的键的数量,并配置一个合理的maxmemory
设置作为第一次尝试。
重要提示:在Redis配置中配置maxmemory
设置是至关重要的:如果最大内存使用量没有上限,那么最终的命中率将是100%,因为所有的键都可以存储在内存中。如果用最大内存指定了太多的键,最终所有的计算机内存都会被使用。还需要配置一个适当的最大内存策略;大多数情况下选择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的内存是不够的。观察一个使用半千兆字节内存的例子。几分钟后,输出稳定到以下数字:
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风格)的需要。