1.慢查询分析。
Redis提供的5种数据结构已经足够强大,但是除此之外,redis还提供了诸如
慢查询分析,功能强大的redis shell ,pipeline,事务和lua脚本,bitmaps,
HyperLogLog,发布订阅,GEO等附加功能。
慢查询分析:通过慢查询分析,找到有问题的命令进行优化。
redis shell:功能强大的redis shell会有意想不到的使用功能。
pipeline:通过pipeline(管道或者流水线)机制有效提高客户端性能
事务与Lua:制作自己的专属原子命令。
bitmaps:通过在字符串数据结构上使用位操作,有效节省内存,位开发提供新的思路。
HyperLogLog:一种基于概率的新算法,难以想象的节省内存空间。
发布订阅:基于发布订阅模式的消息通信机制。
GEO:redis3.2提供了基于地理位置信息的功能。
慢查询就是系统在命令之前前后计算每条命令的执行时间,当超过预设阀值,
就将这条命令的相关信息(发送时间,耗时,命令详细信息)记录。
redis客户端执行一条命令分为四个部分。
(1)发送命令
(2)命令排队
(3)执行命令 --慢查询只统计这步。
(4)返回结果
2.慢查询的两个配置参数
预设阀值怎么设置?
慢查询记录存放在哪里?
redis提供了slowlog-log-slower-than 和 slowlog-max-len 配置来解决这两个问题。
slowlog-log-slower-than 就是预设阀值,它的单位是微妙。
1秒=1000毫秒=1000,000微妙。默认值是10000,超过这个值就记录入慢日志。
如果 slowlog-log-slower-than =0,会记录所有的命令。
slowlog-log-slower-than <0,对于任何命令都不会记录。
从字面意思来看,slowlog-max-len 只是说明了慢查询日志最多存储多少条,并没有
说明存放在哪里?实际上redis使用了一个列表来存储慢查询日志,slowlog-max-len
就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢
查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移除。
redis有两种方法修改配置。
一种时配置文件。
另一种是使用config set命令动态修改。
192.168.1.7:6380> config set slowlog-log-slower-than 20000
OK
192.168.1.7:6380> config set slowlog-max-len 1000
OK
vi redis.conf
slowlog-log-slower-than 20000
slowlog-max-len 1000
--动态配置后,执行config rewrite ;将修改持久化到本地参数文件中。
[root@oracle1 redis6379]# cat redis6379.conf
port 6379
logfile "/data/redis6379/redis.log"
dir "/data/redis6379"
daemonize yes
bind 192.168.1.7
[root@oracle1 redis6379]# redis-cli -h 192.168.1.7 -p 6379 -n 0
192.168.1.7:6379> config set slowlog-log-slower-than 20000
OK
192.168.1.7:6379> config set slowlog-max-len 1000
OK
192.168.1.7:6379> config rewrite
OK
192.168.1.7:6379> exit
[root@oracle1 redis6379]# cat redis6379.conf
port 6379
logfile "/data/redis6379/redis.log"
dir "/data/redis6379"
daemonize yes
bind 192.168.1.7
# Generated by CONFIG REWRITE
slowlog-log-slower-than 20000
slowlog-max-len 1000
(1)获取慢查询日志
--查看所有慢日志。
192.168.1.7:6379> slowlog get
1) 1) (integer) 2
2) (integer) 1718767887
3) (integer) 11
4) 1) "keys"
2) "[a]*"
5) "192.168.1.7:51586"
6) ""
2) 1) (integer) 1
2) (integer) 1718767866
3) (integer) 14
4) 1) "slowlog"
2) "get"
5) "192.168.1.7:51586"
6) ""
3) 1) (integer) 0
2) (integer) 1718767863
3) (integer) 80
4) 1) "keys"
2) "*"
5) "192.168.1.7:51586"
6) ""
--获取指定条数的慢日志。
192.168.1.7:6379> slowlog get 2
1) 1) (integer) 3
2) (integer) 1718767896
3) (integer) 18
4) 1) "slowlog"
2) "get"
5) "192.168.1.7:51586"
6) ""
2) 1) (integer) 2
2) (integer) 1718767887
3) (integer) 11
4) 1) "keys"
2) "[a]*"
5) "192.168.1.7:51586"
6) ""
慢日志有6个属性。
前四个属性分别是:慢日志的表示ID,发生时间戳,命令耗时,执行命令和参数。
(2)慢日志查询当前列表长度
192.168.1.7:6379> slowlog len
(integer) 5
(3)慢查询日志清理
192.168.1.7:6379> slowlog len
(integer) 5
192.168.1.7:6379> slowlog reset
OK
192.168.1.7:6379> slowlog len
(integer) 0
slowlog reset :命令对慢查询日志列表清理。
3.慢查询需要注意的点
slowlog-max-len:配置建议,线上建议调大慢日志列表,记录慢查询时redis会
对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被
剔除的可能,例如线上设置1000以上。
slowlog-log-slower-than:配置建议,默认值超过10毫秒判定为慢查询,需要根据
redis并发量调整该值。由于redis采用单线程响应命令,对于高流量的场景,
如果命令执行时间在1毫秒以上,那么redis最多可支撑OPS不到1000,因此对于高OPS
场景的redis建议设置为1毫秒。
慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令
的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他命令级联阻塞,
因此当客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析出
是否为慢查询导致的命令级联阻塞。
由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失
部分慢查询命令,未来防止这种情况发生,可以定期执行show get命令将慢查询日志
持久化到其他存储中(mysql),然后可以制作可视化界面进行查询