redis-cli是Redis命令行接口,一个允许从终端向Redis服务器发送命令和从服务器读取响应的简单程序。
它有两种主要使用的模式:一是交互模式,即在一窗口内用户键入命令,服务器应答的模式;另一种则是将redis-cli作为一个程序,命令做为其参数,执行,最后以标准输出打印。
在交互模式下,redis-cli提供基本的行编辑能力以提高输入体验。
然而redis-cli不仅仅如此,还可以使用一些options启动程序进入特定的模式,以便redis-cli可以做一些更复杂的任务,比如模拟一个分支并且打印从主干接收到的复制流、检测一个Redis服务器的延迟并且显示满意度或者基至是延迟的样本和频率的图谱,还有许多其他一些事情。
如果你将要广泛Redis或者已经在使了,那么你将碰到许多使用redis-cli的机会。所以花费一些时间熟悉它还是很不错的,你会发现一旦你知道了所有的命令行使用决窍,你的工作效率将更高效。
如果仅仅是想要运行一条命令并且想要服务器的响应在标准输出上,可以如下:
$redis-cli incr mycounter
(integer) 7
此命令返回的是Integer类型的7。Redis命令的返回值是带类型的,可以是Strings,arrays,integers,NULL,errors等等。但是当我们想要将redis-cli的输出做为另一个命令的输入或者将输出直接重定向到一个文件时,带类型的返回可能并不是一个好主意。
实际上只有当redis-cli检测到标准输出是一个tty(一个基本终端)时,redis-cli才会输出一些额外的信息以提高人类可读性,否则它会自动启用原始输出模式,就像如下示例:
$ redis-cli incr mycounter > /tmp/output.txt
$ cat /tmp/output.txt
8
这次integer没有被输出是因为redis-cli检测到此次输出不再是输出到终端。你可以通过选项(option)–raw在终端中强制使用原始输出模式,如下:
$ redis-cli --raw incr mycounter
9
类似的,你也可以在直接输出到文件或者是在管道中作为另一个命令的输入时使用选项(option)–no-raw来强制使用人类可读输出模式。
默认情况下,redis-cli连接127.0.0.1主机在6379端口提供的服务。正如你想的那样,你可以很容易的通过命令行选项改变这些配置。指定主机名或者IP地址使用-h选项,指定端口号使用-p选项,如:
$ redis-cli -h redis15.localnet.org -p 6390 ping
PONG
如果你的redis实例需要密码验证,使用-a指定密码,相当于隐式的调用auth命令:
$ redis-cli -a myUnguessablePazzzzzzword ping
PONG
最后,可以通过-n选项指定代表所要使用数据库的数字选择要使用的数据库,默认使用数字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
redis-cli可以从其他命令获取输入,如:
$ redis-cli -x set foo < /etc/services
OK
$ redis-cli getrange foo 0 50
"#\n# Network services, Internet style\n#\n# Note that "
在上面的例子中你可以看到,第一行中的SET命令的最后一个参数没有指定,也就是没给foo指定对应的值,取而代多的是通过-x选项将一个文件(/etc/services)指定为redis-cli的标准输入,此时即将foo的值设置为了从文件中读取出来的内容。
另一种从其他命w令获取输入的方式如下:
$ cat ~/redis/commands.txt
set foo 100
incr foo
append foo xxx
get foo
$ cat ~/redis/commands.txt | redis-cli
OK
(integer) 101
(integer) 6
"101xxx"
可以看到commands.txt中的命令一个接一个的被redis-cli执行就好像用户的交互式键入一样。
如果文件中某个字符串中含有参数,或者不在同行,或者含有其他特殊字符时,要用引号把字符串给引起来:
$ cat /tmp/commands.txt
set foo "this is a single argument"
strlen foo
$ cat /tmp/commands.txt | redis-cli
OK
(integer) 25
redis-cli可以通过指定命令执行的次数和命令执行之间的间隔多次执行同一命令。这在某些场景下是非常有用的,如当我们想要监控一些Key的内容变化或者监控INFO命令的输出,再或者模拟一些重复发生的事件(像每5秒钟向一个List插入一个新的元素)。
此项功能由两个选项控制:-r 和 -i 。第一个选项用于控制运行多少次命令,第二个选项用于控制两次命令运行之间的时间间隔,以秒为单位(可以支持小数)。
默认情况下,两次命令执行间隔为0秒。
$ redis-cli -r 5 incr foo
(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:1.38M
used_memory_rss_human:1.38M
used_memory_rss_human:1.38M
...新的一行将在下一秒输出...
使用redis-cli进行大量数据插入在另一个页面,因为它自己就值得成为一个主题。请参考批量插入教程
有时候你可能需要redis-cli快速导出数据给其他程序,可以通过CSV格式输出功能完成:
$ redis-cli lpush mylist a b c d
(integer) 4
$ redis-cli --csv lrange mylist 0 -1
"d","c","b","a"
目前此功能还不能实现数据导出,但可以以CSV格式输出。
注:CSV格式,是以逗号分隔值的纯文本格式。
自Redis 3.2开始,redis-cli对使用Lua脚本的新的Lua调试功能 提供广泛支持。对于此功能,请参考Redis Lua调试器文档。
但是,即使不使用Lua调试器,你也可以通过redis-cli运行Lua脚本文件,比起在交互式shell中输入Lua脚本或者将Lua脚本作为一个参数好用多了:
$ cat /tmp/script.lua
return redis.call('set',KEYS[1],ARGV[1])
$ redis-cli --eval /tmp/script.lua foo , bar
OK
Redis EVAL命令接收一个脚本使用的key的集合的参数和其他的非Key参数作为不同的数组。当调用EVAL命令时,我们需要提供Keys的数量。但是在像上面使用redis-cli –eval时,就不需要显式提供 keys的数目,仅仅按惯例用逗号分隔keys参数与非key参数即可。
所以上面所做即:将foo填充到KEYS数组,将bar填充到ARGV数组。
到目前为止,前面都是对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命令连接指定主机名称与端口的Redis实例:
127.0.0.1:6379>connect metal 6379
metal:6379>ping
PONG
正如你看到的,提示符依情况而变。如果用户试图连接一个不可达的实例,那么将进入无连接模式并且每次执行新的命令时都 会试图重新连接:
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
通常情况下,在无连接模式被检测到后,客户端总是试图显式重新连接:如果连接失败,显示错误消息。下面是一个断开连接与重新连接的例子:
127.0.0.1:6379> debug restart
Could not connect to Redis at 127.0.0.1:6379:Connection refused
not connected> ping
PONG
127.0.0.1:6379>(现在又重新连接上了)
当重新连接被执行,redis-cli自动选择原先最后被选的数据库。但是所有原先其他与连接相关的状态全部丢失,如事务状态:
$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使用的是 linenoise line editing库,它不需要其它库即支持行编辑能力。
你可以通过上下箭头键(方向键)访问已执行命令的历史,以避免一次一次的重新键入它们。命令历史保存在用户home目录中的一个叫.rediscli_history的文件,从redis-cli客户端启动开始,断开连接结束。可以设置REDISCLI_HISTFILE环境变量的值来指定存储历史命令的文件,如果要禁用,可以将其设置为/dev/null。
redis-cli同时支持命令名称自动补全功能,能过TAB键或补全和遍历已输入部分为开头的命令。
redis-cli交互模式中支持在命令名称前加一个数字来指定该命令的次数。
127.0.0.1:6379>5 incr mycounter
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5
Redis支持大量的命令,有些时候你可能没记住参数的明确顺序,所以Redis对绝大部分命令提供在线帮助,有以下两种方式:
例如,要显示命令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
group:hyperloglog
注:summary为概述,总结之意,此处用于表示命令的用途。since表示表示支持的版本从2.8.9开始支持此命令。group用于标识命令的类别。
可以使用clear命令对redis-cli终端屏幕清屏。
到目前为止我们了解了redis-cli的两种主要模式:
以下是对其他一些模式的介绍。
此功能是redis-cli的一个少为人知的功能,但是是一个实时监控redis实例的非常有用的功能。要启用这个模式,需要使用–stat选项,此模式下将清晰的输出客户端的相关行为:
$ redis-cli --stat
------ data -------- ---------------- load -------------------------- - child -
keys mem clients blocked requests connections
506 1051.00k 1 0 24(+0) 7
506 1051.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
在此模式下,第秒会输出一行新的数据,与老的数据行成对比。
可以通过-i 选项来控制打印数据间隔,默认为1秒。
在此模式中,redis-cli扮演的是key空间分析器角色。此模式通过选项–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 ususlly 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)
在输出的第一部分(#开头为注释,除外),是在键空间中每遇到一个更大key(同类型比)即生成一条报告,并依次打印。summary(总结)区域则打印的是Redis实例中数据的一般统计信息。
此模式使用的是SCAN命令,所以它可以在繁忙的服务上执行而不影响其他操作。但是,-i选项可以用于在每100个scan命令执行后控制scann进程休息指定时间。
注:总结部分报告的是每次对最大Keys的统计,前面的输出仅仅是为了在执行较大数据集时等待过程中的一点乐趣。
redis-cli可以在不阻塞redis服务(不像在执行像keys 命令时那样)的情况下浏览Key空间并且打印所有Key的名字,或者以指定的模式(正则)过滤它们。此模式同使用–bigkeys选项一样,使用的是*SCANN命令,所以如果数据集变更时Key可以会被多次报告,但是只要在开始遍历前存在就不会有key遗漏:
$ 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选项对结果进行过滤:
$ redis-cli --scan --pattern '*-11*'
key-114
key-117
key-118
key-113
key-115
key-112
key-119
redis-cli客户端能通过使用PUBLISH命令在Redis Pub/Sub渠道(channel)中发布消息。从渠道订阅则不同:此种情况下我们需要一直处于阻塞状态下等等消息,所以被实面为redis-cli的一种特殊模式。与其他模式使用选项不同,此模式通过使用SUBSCRIBE命令或者PSUBSCRIBE命令,并且交互模式与非交互模式均可使用。
$ redis-cli psubscribe '*'
Reading messages... (press Ctrl -C to quit )
1) "psubscribe"
2) "*"
3) (integer) 1
此时我们即已进入Pub/Sub模式,当其他客户端在某些渠道(channel)发送某些消息(message)时,就像你可以在其他客户端运行redis-cli PUBLISH mychannel mymessage,那么此客户端将接着输出如下消息:
1) "pmessage"
2) "*"
3) "mychannel"
4) "mymessage"
此模式非常益于调试Pub/Sub问题,如果要退出,按CTRL-C.
此模式监听运行在Redis实例中的命令:
$ redis-cli monitor
OK
1460100081.165665 [0 127.0.0.1:51706] "set" "foo" "bar"
1460100083.053365 [0 127.0.0.1:51707] "get" "foo"
Redis总是被用地对延迟要求很高的场景,延迟关乎很多方面,从客户端库到网络堆栈,再到Redis实例本身。
redis-cli有许多措施用于研究Redis实例的延迟和理解延迟的最大值、平均值及其分布。
是基本的延迟检测工具是使用–latency选项。使用此选项实际是客户端循环调用PING命令,向Redis实例发送,然后依据获取回应的时候来衡量,此种情景每秒发生100次,并且将统计信息在控制台时时更新。
$ redis-cli --latency
min: 0,max: 1,avg: 0.19(427 samples)
此统计是秒为单位进行的。通常,由于kernel调度进程要运行redis-cli自身,redis实例的平均延迟趋于被高估一些,所以上面的平均延迟0.19可能真实为0.01或者更少。不过这并不是个问题,因为我们总是更倾向于更高时间粒度的统计(那时影响可几乎可忽略不计)。
有时研究在一段时间内最大延迟与平均延迟怎么计算的是非常有用的。–latency-history选项与–latency类似,但是默认每15秒统计一次:
$ redis-cli --latency-history
min: 0 ,max: 1, avg: 0.14(1314 samples) -- 15.00 seconds range
min: 0 ,max: 5, avg: 0.18(1299 samples) -- 15.01 seconds range
注:可以通过-i 选项来改变上面统计的默认时间间隔15秒。
其他延迟统计工具:
在Redis复制的第一个同步期间,主服务与从服务会以RDB文件的格式交换所有的数据集。此特性被redis-cli利用来提供远程备份功能(允许从任何Redis实例传送RDB文件到本地计算机的运行中的redis-cli)。使用–rdb 选项使用此功能:
$ redis-cli --rdb /tmp/dump.rdb
SYNC sent to master, writting 13256 bytes to '/tmp/dump.rdb'
Transfer finished with success.
此功能可以简单高效的确保你拥有Redis实例的灾难恢复备份RDB数据。但是,如果在脚本文件中使用此选项或者是用于长期任务,要确保检查此命令返回值,如果返回非0,将会发生如下错误:
$ redis-cli --rdb /tmp/dump.rdb
SYNC with master failed:-ERR Can't SYNC while not connected with my master
$ echo $?
1