Redis为什么会出现码查询:
Redis是单线程的,所有的请求发送过来的时候都是需要排队的(先进先出的队列),当一个查询语句非常耗时的话,在它之后的语句都是需要排队等待的,这种情况经常会造成客户端超时。
下面是一条Redis命令的声明周期,如果步骤3执行命令非常耗时的话,会导致大量命令阻塞在步骤2上面:
配置慢查询日志:
在Redis中配置慢查询有两种方式,一种是修改配置文件,另一种是使用动态命令去配置:
# 阈值,超出此时间段的命令会被记录为慢查询,单位为微秒,默认为10000微秒。注:1秒 = 1000000(一百万微秒)
# 如果设置为0的话,则会记录全部Redis命令,设置<0则全部不记录
config set slowlog-log-slower-than 10000
# 保留多少条慢查询日志,属于先进先出的队列,如果设置过小,可能导致部分慢查询丢失
config set slowlog-max-len 1000
# 用户更新配置文件
config rewrite
获取慢查询日志:
# 获取当前慢查询条数
slowlog len
# 获取n条慢查询日志,n为空则查询全部
slowlog get [n]
查看慢查询日志:
redis> SLOWLOG GET
1) 1) (integer) 4 # 日志的唯一标识符(uid)
2) (integer) 1378781447 # 命令执行时的 UNIX 时间戳
3) (integer) 13 # 命令执行的时长,以微秒计算
4) 1) "SET" # 命令以及命令参数,以数组的形式显示,拼成一句话就是整个命令
2) "database"
3) "Redis"
2) 1) (integer) 3
2) (integer) 1378781439
3) (integer) 10
4) 1) "SET"
2) "number"
3) "10086"
注意:
- 慢查询只记录查询时间,并不包括排队时间和网络传输时间
- 建议持久化慢查询日志,方便日后整理调优