1.1.1. 24.命令行工具

执行单条命令

如果输出内容较大,可以输出到文件中。

$ redis-cli info > info.txt
$ wc -l info.txt
     120 info.txt

可以指定某个库

# -n 2 表示使用第2个库,相当于 select 2
$ redis-cli -h localhost -p 6379 -n 2 ping
PONG

批量执行命令

使用管道将 cat 命令的标准输出连接到 redis-cli 的标准输入中

$ cat cmds.txt
set foo1 bar1
set foo2 bar2
set foo3 bar3
......
$ cat cmds.txt | redis-cli
OK
OK
OK
...

或者使用 输入重定向

$ redis-cli < cmds.txt
OK
OK
OK

set 多行字符串

可以使用 -x 选项,将标准输入的内容作为最后一个参数

$ cat str.txt
Ernest Hemingway once wrote,
"The world is a fine place and worth fighting for."
I agree with the second part.
$ redis-cli -x set foo < str.txt
OK
$ redis-cli get foo
"Ernest Hemingway once wrote,\n\"The world is a fine place and worth fighting for.\"\nI agree with the second part.\n"

重复执行指令

// 间隔1s,执行5次,观察qps的变化
$ redis-cli -r 5 -i 1 info | grep ops
instantaneous_ops_per_sec:43469
instantaneous_ops_per_sec:47460
instantaneous_ops_per_sec:47699
instantaneous_ops_per_sec:46434
instantaneous_ops_per_sec:47216

如果将次数设置为 -1,那么将一直执行下去,如果不设置 -i 选项,那么将不会有间隔,直接输出 5 次。

在交互模式下也可以这样做

127.0.0.1:6379> 5 ping
PONG
PONG
PONG
PONG
PONG
# 下面的指令很可怕,你的屏幕要愤怒了
127.0.0.1:6379> 10000 info
.......

导出 csv

redis 不能一次性导出所有内容为 csv,不过单条指令的可以。

$ redis-cli rpush lfoo a b c d e f g
(integer) 7
$ redis-cli --csv lrange lfoo 0 -1
"a","b","c","d","e","f","g"
$ redis-cli hmset hfoo a 1 b 2 c 3 d 4
OK
$ redis-cli --csv hgetall hfoo
"a","1","b","2","c","3","d","4"

--csv ,只是将输出结果用「逗号」分割。

执行 lua 脚本

$ cat mset.txt
return redis.pcall('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])
$ cat mget.txt
return redis.pcall('mget', KEYS[1], KEYS[2])
$ redis-cli --eval mset.txt foo1 foo2 , bar1 bar2
OK
$ redis-cli --eval mget.txt foo1 foo2
1) "bar1"
2) "bar2"

监控服务器状态

可以使用 -i 来控制输出间隔(单位 s)。

$ redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys       mem      clients blocked requests            connections
2          6.66M    100     0       11591628 (+0)       335
2          6.66M    100     0       11653169 (+61541)   335
2          6.66M    100     0       11706550 (+53381)   335
2          6.54M    100     0       11758831 (+52281)   335
2          6.66M    100     0       11803132 (+44301)   335
2          6.66M    100     0       11854183 (+51051)   335

扫描大 KEY

使用 --bigkeys 可以很快扫描出内存中的大 key,使用 -i 控制间隔,避免扫描过程中 ops 徒增报警。

agrant@homestead:/etc/redis$ redis-cli --bigkeys -i 0.01

# 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 'foo1' with 4 bytes
[00.00%] Biggest list   found so far 'lfoo' with 7 items

-------- summary -------

Sampled 4 keys in the keyspace!
Total key length in bytes is 16 (avg len 4.00)

Biggest   list found 'lfoo' has 7 items
Biggest string found 'foo1' has 4 bytes

1 lists with 7 items (25.00% of keys, avg size 7.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
3 strings with 12 bytes (75.00% of keys, avg size 4.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

redis-cli 会对每一种类型都记录最大长度的 key。对于每个对象刷新一次就会立即输出一次,它能保证输出 top1 的key,但是 top2 top3 的无法保证,一般都是多扫几次或者清除top1 的 key 之后再重新扫描一次。

采样服务器指令

如果有一台 redis 服务器 ops 过高,如何判断是哪个业务导致的。可以使用 monitor 指令来判断。

$ redis-cli --host 192.168.x.x --port 6379 monitor
1539853410.458483 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"
1539853410.459212 [0 10.100.90.61:56659] "PFADD" "growth:dau:20181018" "2klxkimass8w"
1539853410.462938 [0 10.100.90.62:20681] "GET" "6yax3eb6etq8:{-7}"
1539853410.467231 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2kei0to86ps1"
1539853410.470319 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"
1539853410.473927 [0 10.100.90.61:58128] "GET" "6yax3eb6etq8:{-7}"
1539853410.475712 [0 10.100.90.61:40277] "PFADD" "growth:dau:20181018" "2km8sqhlefpc"
1539853410.477053 [0 10.100.90.62:61292] "GET" "6yax3eb6etq8:{-7}"

判断服务器时延

虽然 linux 有 ping 命令,可以判断时延。但是 Redis 提供的原理与 ping 不太一样。它不仅判断了当前机器与 Redis 服务器之间的指令时延,还要判断和当前 Redis 主线程是否忙碌有关。如果 ping 命令发现时延很小,但是 Redis 时延很大,说明 Redis 在执行指令时会有轻微卡顿。

$ redis-cli --host 192.168.x.x --port 6379 --latency
min: 0, max: 5, avg: 0.08 (305 samples)

时延单位是 ms。redis-cli 还能显示时延的分布情况,而且是图形化输出。

$ redis-cli --latency-dist

图形化输出

远程备份

可以让远程的 Redis 实例备份到本机上,远程就会执行一次 bgsave ,然后将 rdb 传输到客户端。

$ ./redis-cli --host 192.168.x.x --port 6379 --rdb ./user.rdb
SYNC sent to master, writing 2501265095 bytes to './user.rdb'
Transfer finished with success.

模拟从库

如果想看到主从服务器之间都同步了哪些数据,可以使用 redis-cli 模拟从库

$ ./redis-cli --host 192.168.x.x --port 6379 --slave
SYNC with master, discarding 51778306 bytes of bulk transfer...
SYNC done. Logging commands from master.
...

从库连上主库的第一件事是全量同步,所以看到上面的指令卡顿这很正常,待首次全量同步完成后,就会输出增量的 aof 日志。

Copyright © Kagami丶 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-12-10 20:25:25

results matching ""

    No results matching ""