1.
Redis-cli: Learn how to master the Redis command line interface,
something you'll be using a lot in order to administer, troubleshoot and experiment with Redis.
Redis-cli: 学习如何掌握Redis 命令行接口,一些你会使用很多来管理,故障排除和实验
redis-cli,Redis 命令行接口:
redis-cli 是Redis 命令行接口, 一个简单的程序允许你发送命令行到Redis,读取服务器的响应,直接从终端。
它有两个模式:
一个是交互式模式,有一个PEPL(读取eval 打印输出)
用户类型命令和得到响应,另外的模式命令行是发送作为redis-cli的参数,被执行,打印到标准输出。
在交互式模式下,redis-cli 有基本的行编辑功能来提供好的打印体验:
然而redis-cli 不仅仅是那样, 有选项你可以使用来启动程序为了放到指定的模式。
这样redis-cli 可以定义做更加复杂的任务,像模仿一个slave和打印复制流它从master收到的,
检查Redis server显示信息或者甚至一个延迟样本的频度,和其他的东西。
本guide 会涵盖redis-cli的不同部分, 从简单的开始和以高级的结束:
如果 你打算广泛使用Redis,或者如果你已经这么做,你可能会使用redis-cli很多。
花费更多的时间来熟悉它是一个很好的主意,你可以看到你会工作更加有效使用Redis 一旦
你知道 它命令行接口的所有的技巧。
Command line usage 命令行用法:
只运行一个命令行有它的回复被打印到标准输出是和命令行执行一样简单
$ redis-cli incr mycounter
(integer) 7
[root@node01 ~]# redis-cli -a 'r,uLgt.313' incr mycounter
(integer) 1
[root@node01 ~]# redis-cli -a 'r,uLgt.313' incr mycounter
(integer) 2
[root@node01 ~]# redis-cli -a 'r,uLgt.313' incr mycounter
(integer) 3
[root@node01 ~]# redis-cli -a 'r,uLgt.313' incr mycounter
(integer) 4
命令行的返回是"7" 因为Redis 回复是被打印的(它们可以是字符串,数组,整型,NULL,errors 等等),
你可以看到回复的类型在()之间
然而 这个不是一个好主意 当redis-cli的输出必须用于作为另外一个命令的输入,或者我们需要直接重定向到文件。
实际上redis-cli 只显示额外的信息 改善可读性当它检查到标准输出是一个tty(一种基本终端)。
否则,它将自动启动原始输出模式,像下面的示例所示:
$ redis-cli incr mycounter > /tmp/output.txt
$ cat /tmp/output.txt
8
这个time(整型)是省略的因为GLI 检测到output 是不再输出到terminal.
$ redis-cli --raw incr mycounter
9
类似的, 你可以强制人可读的输出当写一个文件或者管道到其他命令通过使用 --no-raw
Host, port, password and database
默认 redis-cli 连接到server 在地址127.0.0.1端口6379.正如你所猜测,
你可以简单的改变这个使用命令行选项。
指定一个不同的主机名或者一个IP地址,使用-h.
$ redis-cli -h redis15.localnet.org -p 6390 ping
PONG
[root@node01 ~]# redis-cli -a 'r,uLgt.313' -h 192.168.137.2 ping
PONG
如果你的实例是密码保护的,-a<password>选项会执行认证 保留明确的使用AUTH 命令:
$ redis-cli -a myUnguessablePazzzzzword123 ping
PONG
最后,它是可以发送一个命令行操作一个数据库nuber 相比默认的0 通过使用-n选项:
$ 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 key 到文件/etc/services 的内容,它可以使用-x 选项:
[root@node01 ~]# redis-cli -a 'r,uLgt.313' -x set foo</etc/services
OK
[root@node01 ~]# redis-cli -a 'r,uLgt.313' getrange foo 0 100
"# /etc/services:
# $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
#
# Network services, Intern"
[root@node01 ~]#
因为你可以使用 在上面的session的第一行, SET 命令的最后参数不是被指定的。
参数SET foo 没有不实际的值
相反, -x 选项是被指定的,一个文件是被重定向到CLI的标准输入。
因此,input 是读取,是用于最后参数用于命令行,这个是有用的用于脚本:
不同的方法是喂养redis-cli 一个命令的序列写到一个文本文件:
连续运行相同的命令:
它是可能执行相同的命令 一个指定的时间数量 使用一个用户选择的pause 在执行期间。
这是有用的在不同的上下文,比如 当我们需要持续的监控一些key 内容或者INFO字段的输出。
或者当我们需要模拟一些写事件(像push 一个新的item 到一个list)
默认情况下,间隔设置为0, 因此命令行是被执行ASAP:
要永远运行相同的命令,use -1 作为计数,为了监控 RSS内存
[root@node01 ~]# redis-cli -a 'r,uLgt.313' -r -1 -i 1 INFO|grep rss
used_memory_rss:8712192
used_memory_rss:8712192
Mass insertion of data using redis-cli:
Mass 插入使用redis-cli 是覆盖一个单独的page 因为它是值得研究的话题:
Interactive mode 交互模式:
到目前为止 我们探索 如何使用Redis CLI 作为一个命令行程序。
这是非常有用的对于脚本和某些测试选项,然而很多人会花费大量的事件在redis-cli 使用它的交互模式:
在交互模式下,用户类型的Redis 命令在提示行。
命令行是发送到server,被处理,回复是被解析回来和提供一个简单的格式来读取:
没有指定是需要的运行CLI 在交互模式,只要在没有任何参数下:
$ redis-cli
127.0.0.1:6379> ping
PONG
string 127.0.0.1:6379>是提示的,它提醒你 你是连接到一个给定的Redis 实例。
提示改变server 你需要去连接,或者当你操作在数据库不同于 数据库zero 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
处理连接和重连:
使用连接命令在交互模式让它可以连接到不同的实例,通过指定Hostnam和端口:
127.0.0.1:6379> connect metal 6379
metal:6379> ping
PONG
正如你看到的prompt 改变,如果用户尝试连接到一个实例 是不可用的,
redis-cli 进入disconnected 模式和尝试重新连接在每个新的命令:
通常在一个断开是被检测到, CLI 总是尝试重新连接。
如果尝试失败,它显示错误和进入断开连接状态。
下面是一个断开连接和重新连接的例子:
Editing, history and completion 编辑 历史和完成:
特殊的操作模式:
到目前为止,我们看到了主要的两种redis-cli 模式:
1.命令行执行Redis 命令
2. 交互式使用
然而CLI执行其他辅助的任务相关到Redis是在下面章节被描述:
1.监控工具显示连续的统计数据关于一个Redis server
2.扫描一个Redis 数据库对于非常大的keys
3.key space scanner 使用模式匹配
4.充当一个Pub/Sub 客户端来订阅到频道
5.监控命令执行到Redis 实例
6.检查 Redis潜在因素以不同的方式:
7.检查调度程序 本地的computer的延迟
8.传输RDB 从一个远程Redis server 备份到本地
9.作为一个Redis slave 用于展示slave接收到的
10.模拟LRU 负载用于显示统计信息关于keys 命中
连续的数据模式:
这个可能是redis-cli 一个鲜为人知的特点,是非常有用的 用于监控Redis 实例。
为了启动这个模式, --stat选项是被使用的。
output 是非常清楚的关于CLI的行为:
[root@node01 ~]# redis-cli -a 'r,uLgt.313' --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
17 1.40M 2 0 103 (+0) 43
17 1.40M 2 0 104 (+1) 43
17 1.40M 2 0 105 (+1) 43
17 1.40M 2 0 106 (+1) 43
17 1.40M 2 0 107 (+1) 43
17 1.40M 2 0 108 (+1) 43
在这种模式下 一个新的行是每秒被打印具有有用的信息。
你可以了解内存使用发生了什么,客户端连接.
扫描大的keys:
在这个特殊的模式, redis-cli 工作为一个key space 分析器。
它扫描数据集用于big keys,
但是也提供信息关于数据类型,数据集的组成。
这个模式是通过--bigkeys option 启用的,产生一个相当长的输出:
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).
[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大于之前的大的值(同一类型)
汇总章节提供总体的状态关于数据
程序使用SCAN命令,因此可以被再次执行在一个繁忙的server 而不影响操作,
然而-i 选项可以用于调节扫描特定的分数用于每个100keys 请求。
例如, -i 0.1 会减慢程序大量的执行,但也会降低服务器的负载到一个极小的数量。
请注意 汇总也报告一个更干净的报告最大的keys 。
Getting a list of keys 获取密钥列表:
它也可以扫描key 空间, 在某种程度上,不会堵塞Redis server( 当你使用一个命令行像KEYS *会发生),
打印所有的key names,或者 过滤它们用于指定的模式。
这种模式下,像--bigkey 选项,使用SCAN命令,因此keys 可以被多次如果数据库是在改变的,
但是不会有key丢失,如果key 是在的自从重复的开始。
[root@node01 ~]# redis-cli -a 'r,uLgt.313' --scan
a4
a1
a5
user1
foo
user2
list
wangpin
set-key
key
hash-key
bb
a
aa
a6
a3
mycounter
注意 head -10 是用于为只打印头几行。
Scanning 是可以使用底层的模式匹配SCAN 命令的能力 使用--pattern option.
[root@node01 ~]# redis-cli -a 'r,uLgt.313' --scan --pattern 'a*'
a4
a1
a5
a
aa
a6
a3
管道 输出通过wc 命令可以用于统计对象的种类,通过key的名字:
[root@node01 ~]# redis-cli -a 'r,uLgt.313' --scan --pattern 'a*' | wc -l
7
Pub/sub mode
CLI 是可以发布消息在Redis Pub/Sub 频度只是使用PUBLISH 命令。
这是预期的因为PUBLISH 命令是非常类似其他命令。
订阅到频道为了接收消息是不同的。 在这种情况下,我们需要block和等待消息,
因此 这个是实现作为一种特殊的模式在redis-cli.
不像其他指定的模式 这个模式是不启用的通过使用一个特定的选项,但是简单的使用SUBSCRIBE or PSUBSCRIBE command,
在交互或者非交互模式下:
127.0.0.1:6379> psubscribe '*'
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*"
3) (integer) 1
阅读消息消息显示我们进入 Pub/Sub mode.
当其他的client 发布一些消息在一些频道,你可以使用
redis-cli PUBLISH mychannel mymessage,
CLI Pub/Sub 模式会显示一些如下:
127.0.0.1:6379> PUBLISH mychannel mymessage,
(integer) 1
1) "pmessage"
2) "*"
3) "mychannel"
4) "mymessage,"
redis提供的发布订阅命令
命令 用例和描述
subscribe subscribe channel [channel …] 订阅一个或多个频道
unsubscribe unsubscribe [channel [channel …]] 退订频道,如果没有指定频道,则退订所有的频道
publish publish channel message 给指定的频道发消息
psubscribe psubscribe pattern [pattern …] 订阅给定模式相匹配的所有频道
punsubscribe punsubscribe [pattern [pattern …]] 退订给定的模式,如果没有指定模式,则退订所有模式
测试:
redis 01:
[root@node01 ~]# redis-cli
127.0.0.1:6379> auth 'r,uLgt.313'
OK
127.0.0.1:6379> subscribe testchannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "testchannel"
3) (integer) 1
redis 02:
[root@node01 ~]# redis-cli
127.0.0.1:6379> auth 'r,uLgt.313'
OK
127.0.0.1:6379> subscribe testchannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "testchannel"
3) (integer) 1
给频度发送消息:
127.0.0.1:6379> PUBLISH testchannel message999888777
(integer) 2
可以看到两个频道都收到消息
监控命令在Redis执行:
类似于 Pub/Sub mode, 监控模式是会自动输入 一旦你使用MONITOR 模式。
它会打印所有的命令从实例接收:
监控 Redis 实例的延迟:
Redis 是经常被使用的在上下文 延迟是非常关键的。
延迟涉及多个移动部分在应用内部,从客户端库到网络stack,到Redis 实例本身:
CLI 有多个设备用于学习一个Redis 实例的延迟和了解延迟的最大值,平均和分布
基本的延迟检查工具是 --latency option. 使用这个选项CLI 运行一个循环 PING命令是发送到Redis 实例,
以及得到响应的时间。 这个发生 每秒100次,并且状态是实时更新的;
[root@node01 ~]# redis-cli -a 'r,uLgt.313' --latency
min: 0, max: 3, avg: 0.35 (860 samples)^C
统计数据是提供 单位为毫秒.通常, 一个非常快的实例的平均延迟往往被高估一点
因为延迟由于kernel 队列运行redis-cli本身。
有时 它是有用的学习最大和平均延迟发生。
--latency-history 选项 是用于那个目的,它工作类似 --latency, 但是默认15秒(默认) 一个新的sampling session 被开始
你可以改变sampling session的长度 使用-i<间隔选项>
最先进延迟研究工具,但是也有点难得解释对于非经验用户,
是有能力使用颜色终端来显示一个延迟
你可以看到有颜色的输出 表明不同的样本的百分比,不同的ASCII字符表明不同的延迟数字。
这种模式是启用通过使用 --latency-dist option:
还有一个另外的漂亮的不寻常的延迟工具实现在redis-cli.
它不检查 Redis 实例的延迟性,但是计算你是运行在redis上的延迟。
你会问是什么延迟?
Remote backups of RDB files RDB文件远程备份:
Redis 复制的第一个同步期间, master和slave交换整个数据集以一个RDB文件的格式。
这个功能是利用redis-cli 为了提供一个远程的备份设备,允许转换一个RDB文件从任何Redis 实例到本地的计算机。
$ redis-cli --rdb /tmp/dump.rdb
SYNC sent to master, writing 13256 bytes to '/tmp/dump.rdb'
Transfer finished with success.
这个是一个简单但是有效的方式来确保你有一个灾难恢复RDB 备份你的Redis 实例。
然而 当使用这个选项在脚本或者定时任务,确保检查命令的返回值 。
Slave mode:
CLI的 slave模式是一个高级功能有用的对于Redis 开发和用于调试操作。
它允许检查一个master 发送到它的slaves 在复制流为了扩散写入到它的副本。
选项名字是简单的 --slave
命令行开始通过丢弃第一个同步的RDB文件, 日志记录每个接收到的命令
Performing an LRU simulation: 执行一个LRU 模拟:
Redis 是通常作为一个cache 使用LRU 驱逐。
根据KEY的数量和内存分配用于cache的总量(直接通过maxmemory指定),
cache的总量hits和misses 会改变。
有时候,模拟命中率是非常有用的正确提供你的cache.
CLI 有一个指定的模式它执行一个模式GET和SET操作,
使用一个80-20%幂律分布的请求模式。
这意味着 keys的20% 会被请求 80%的时间:
理论上,给定请求的分配,Redis 内存开销,它可能可以计算命中率使用一个数学公式。
然而,Redis 可以配置使用不同的LRU设置(样本数)和LRU的实现,这是近似的在Redis,
改变了很多在不同的版本。