【redis】慢查询

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),然后可以制作可视化界面进行查询

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值