1
redis-cli命令的 --stat选项
关于stat选项,官网也是介绍的比较简单。使用redis-cli命令加上stat选项可以实时监视redis实例,比如当前节点内存中缓存的 key总数以及每秒处理请求数等。stat默认每隔一秒会输出一行信息,如果需要改变频率可使用-i <interval> 指定频率,单位为秒,如--stat -i 100。需要配合-h选项使用。
关于requests与connections官方也没有介绍,自己结合本地和线上的输出,做了对比得出的结论。
- keys:当前节点缓存的key总数
- mem:当前节点缓存总的占用内存
- clients:当前节点的活跃连接数,或者说未断开连接的总连接数
- blocked:当前节点正在等待阻塞命令的数量
- requests:当前处理的请求数,与上一次请求数相减可知1秒所处理的请求,或者说所执行的命令数。
- connections:是历史连接总数,即到目前为止,一共新建了多少个连接。与前一次相减,可以得出一秒内新建的连接数。
Requests列括号里的数是每间隔所处理的命令数。比如当前60068496037减去前一次60068451875 等于44162,由于stat默认频率是每秒输出一次,44162就是每秒执行4万多条命令。正好是括号里面的数字,也因此可以知道,括号里面的数字代表每秒(interval)执行的命令数。
当然--stat每秒输出一次结果也是一条命令,所以在没有任何请求的情况下,你看到的requests是自增的,可以本地起个redsi服务,然后使用redis-cli --stat观察下输出。
Blocked并不是排队等待执行的命令数,而是客户端执行阻塞命令的总数。比如BLPOP。
Connections也是很有用的参数,如果发现connections与前一次的差值很大,且很频繁,那就要看下代码中连接池配置是否生效了。
网络延迟也是我们要关注的问题
redis-cli命令--latency选项可以测试当前服务器与redis某个节点的网络延迟。
avg:0.25,即延迟为250μs。如果通过外网连接网络延迟会很高,比如跨机房的redis调用,延迟高的情况下使用redis反而比使用本地硬盘读写性能更差。
还有其它影响redis性能的因素,比如内存的使用,持久化策略等。
AOF持久化策略影响性能问题
如果数据不需要持久化,或者要求不严格,建议直接禁用掉AOF持久化策略,同时RDB快照的保存时间间隔也要调高一些,比如一小时一次,以此达到更高的性能。
1)主线程负责写入AOF缓冲区。
2)AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时间。
3)主线程负责对比上次AOF同步时间。如果距上次同步成功时间在2秒内,主线程直接返回;如果距上次同步成功时间超过2秒,主线程将会阻塞,直到同步操作完成。
如果系统fsync缓慢,将会导致Redis主线程阻塞影响效率。
上次我将一千两百万记录的ip库数据写入redis时,就因为开启了aof持久化策略,由于大批量数据的写入,导致aof文件几乎每秒重写一次,后面改为1g时重写也因为文件过大重写时间长,没有一次能够成功将一千两百万数据成功写入的。