当前位置: 首页 > 工具软件 > xredis-server > 使用案例 >

Redis Shell 之 redis-cli,redis-server,redis-benchmark,Pipeline 详解 (九)

宋高寒
2023-12-01

Redis提供了redis-cli 、 redis-server 、 redis-benchmark 等shell工具。

一、redis-cli详解

1、-r

-r(repeat)选项代表将命令执行多次;如执行三次ping:

bogon:~ ww$ redis-cli -r 3 ping
PONG
PONG
PONG
bogon:~ ww$ 

2、-i

-i(interval)选项代表每隔几秒执行一次命令,但是-i必须和-r一起使用。

//每隔1秒执行一次ping,执行五次
bogon:~ ww$ redis-cli -r 5 -i 1 ping
PONG
PONG
PONG
PONG
PONG
bogon:~ ww$ 

注意:-i的单位是秒,不支持毫秒,如果想每隔10毫秒执行一次,可以用-i 0.01

info命令:返回关于 Redis 服务器的各种信息和统计数值。

使用方法: redis-cli info

3、-x

代表从标准输入读取数据作为redis-cli的最后一个参数,如:

bogon:~ bjhl$ echo 'world' |redis-cli -x set wao
OK
bogon:~ bjhl$ redis-cli 
127.0.0.1:6379> get wao
"world\n"
127.0.0.1:6379> 

4、-c

连接Redis Cluster 节点时需要使用的,-c选项可以防止moved和ask异常。

5、-a

如果Redis配置了密码,可以用-a(auth)选项,有了这个选项就不需要手动输入auth命令。

6、--scan 和 --pattern

--scan选项和--pattern 选项用于扫描指定模式的键,相当于使用scan命令

7、--slave

该选项就是把当前客户端模拟成当前的redis节点的从节点,可以用来获取当前redis节点的更新操作。合理的利用这个选项可以记录当前连接redis节点的一些更新操作,这些更新操作很可能是实际开发业务时需要的数据。

8、--rdb

该选项会请求Redis实例生成并发送RDB持久化文件,保存在本地。可使用持久化文件的定期备份。

9、--pipe

该选项用于将命令封装成Redis通讯协议定义的数据格式,批量发给Redis执行。

10、--bigkeys

该选项使用scan命令对Redis的键进行采样,从中找到内存占用比较大的键值,这些键可能是系统的瓶颈。

bogon:~ ww$ 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 'he' with 6 bytes
[00.00%] Biggest string found so far 'sl' with 12 bytes
[00.00%] Biggest list   found so far 'mylist' with 32298 items

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

Sampled 9 keys in the keyspace!
Total key length in bytes is 59 (avg len 6.56)

Biggest string found 'sl' has 12 bytes
Biggest   list found 'mylist' has 32298 items

8 strings with 39 bytes (88.89% of keys, avg size 4.88)
1 lists with 32298 items (11.11% of keys, avg size 32298.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
bogon:~ ww$ 

11、--eval

该选项用于执行Lua脚本

12、--latency

latency有三个选项,分别是--latency、--latency-history、--latency-dist;他们都可以检测网络延迟,对于Redis开发和运维非常有帮助。

1)--latency

该选项可以测试客户端到目标Redis的网络延迟,如客户端A和Redis在一个机房A,客户端B在另外一个机房B,那么该命令就会看的出,B的平均网络延迟会稍微高一些。

bogon:~ ww$ redis-cli -h 127.0.0.1 -p 6379 --latency 
min: 0, max: 1, avg: 0.25 (424 samples)

如上代码,如果是B使用该命令,avg应该会比A使用该命令的值高。因为距离比较远

2)--latency-history

--latency的执行结果只有一条,如果想以分时段的形式了解延迟信息,可以使用 --latency-history 选项:

redis-cli -h 127.0.0.1 --latency-history

redis-cli -h 127.0.0.1 -p 6379 --latency-history
min: 0, max: 2, avg: 0.27 (1301 samples) -- 15.01 seconds range
min: 0, max: 2, avg: 0.27 (1301 samples) -- 15.00 seconds range
.
.
.
min: 0, max: 1, avg: 0.28 (1308 samples) -- 15.00 seconds range

可以看出,每15秒输出一次,可以通过-i参数控制时间间隔

如: redis-cli -h 127.0.0.1 -p 6379 --latency-history -i 1  //一秒输出一次

3)--latency-dist

该选项会使用统计图表的形式从控制台输出延迟统计信息。

13、--stat

该选项可以实时获取Redis的重要统计信息,虽然info命令中的统计信息更全,但是能实时看到一些增量的数据(如requests)对于redis的运维还是有一定帮助的。

14、--raw和--no-raw

--no-raw 选项是要求命令的返回结果必须是原始的格式,--raw则恰恰相反,返回时格式化后的结果。

bogon:~ ww$ redis-cli --no-raw get he
"\xe5\x91\xb5\xe5\x91\xb5"
bogon:~ ww$ redis-cli --raw get he
呵呵
bogon:~ ww$ 

二、redis-server 详解

redis-server 除启动Redis之外,还有一个--test-memory选项,可以用来检测当前操作系统能否稳定的分配指定容量的内存给Redis,通过这种检测能避免因为内存问题造成的redis奔溃。

如:redis-server --test-memoey 1024 ;检测当前系统能否为redis提供1G的内存。

该功能更偏向于调试和测试。例如:想迅速占满机器内存做一些极端的测试。该功能是个不错的选择。

三、redis-benchmark详解

redis-benchmark可以为Redis做基准性能测试,它提供了很多选项帮助开发和运维人员测试Redis的相关性能。

1、-c

-c(clients) 选项代表客户端的并发数量(默认是50)

2、-n

-n(num)选项代表客户端请求总量(默认是100 000)

例如:redis-benchmark -c 100 -n 20000 代表 100个客户端同事请求redis,一共执行20000次,redis-benchmark会对各类数据结构的命令进行测试,并给出性能指标。

//执行命令后截取输出的一段进行说明
====== GET ======
  20000 requests completed in 0.34 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

73.86% <= 1 milliseconds
99.93% <= 2 milliseconds
100.00% <= 2 milliseconds
58479.53 requests per second

执行命令后,如上面输出,测试get命令,一次执行20000个请求,0.34秒完成,每次请求数据量是3个字节,73.86%<=1毫秒,Redis每秒可以执行58479.53次ge请求。

3、-q

-q选项仅仅显示redis-benchmark的requests per second 信息,例如:

bogon:password ww$ redis-benchmark -c 100 -n 20000 -q
PING_INLINE: 69930.07 requests per second
PING_BULK: 53333.33 requests per second
SET: 58823.53 requests per second
GET: 60790.27 requests per second
INCR: 71174.38 requests per second
LPUSH: 69204.15 requests per second
RPUSH: 68965.52 requests per second
LPOP: 68259.38 requests per second
RPOP: 69686.41 requests per second
SADD: 68965.52 requests per second
HSET: 71174.38 requests per second
SPOP: 62305.29 requests per second
LPUSH (needed to benchmark LRANGE): 68728.52 requests per second
LRANGE_100 (first 100 elements): 17167.38 requests per second
LRANGE_300 (first 300 elements): 8041.82 requests per second
LRANGE_500 (first 450 elements): 5625.88 requests per second
LRANGE_600 (first 600 elements): 4013.65 requests per second
MSET (10 keys): 53050.40 requests per second

4、-r

在一个空的Redis上执行了redis-benchmark会发现只有四个键:

127.0.0.1:6379> keys *

1) "myset:__rand_int__"

2) "key:__rand_int__"

3) "mylist"

4) "counter:__rand_int__"

如果想向Redis插入更多的键,可以执行使用-r(randon)选项。可以向redis插入更多的键

注:-r后的的参数不是随机数的个数,如 redis-benchmark -r 10000 表示在key,counter,myset键后加一个12位的后缀,-r代表只对后四位做随机出来,

5、-p

-p 选项代表每个pipeline的数据量 (默认为1)

6、-t <boolean>

-t 选项可以对指定命令进行基准测试

bogon:~ ww$ redis-benchmark -t get,set -q
SET: 64516.13 requests per second
GET: 61728.39 requests per second
bogon:~ ww$ 

7、-k

该选项代表客户端能否使用keepalive,1为使用,0为不使用,默认值为1;

8、--csv

   该选项会将结果按照csv格式输出,便于后续处理,如导出到Excel等。

bogon:~ ww$ redis-benchmark -t get,set --csv
"SET","65659.88"
"GET","61236.99"
bogon:~ ww$ 

四、Pipeline详解

Redis客户端发送一条命令分四个过程:1:发送命令,2:命令排队,3:命令执行,4:返回结果。

其中1和4称为Round Trip Time (RTT,往返时间)

Redis提供了批量操作命令,有效的节约了RTT,但是大部分命令时不支持批量操作的,仍需要消耗n次RTT,Pipeline(流水线)机制能改善该问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将结果按顺序返回给客户端,整个过程只需要消耗一次RTT。

redis-cli的--pipe选项实际就是使用Pipeline机制。

如: echo -en '*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | redis-cli --pipe  

原生批量命令与Pipeline对比

  1. 原生批量命令是原子的,Pipeline是非原子的
  2. 原生批量命令是一个命令对应多个key,Pipeline支持多个命令
  3. 原生批量命令是Redis服务端支持的实现,而Pipeline需要服务端和客户端的共同实现。

注:Pipeline虽然好用,但是每次组装的命令不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成网络阻塞。可以将一次包含大量命令的Pipeline拆分成多个较小的Pipeline来完成。

 

 

 类似资料: