MySQL数据库工程师入门实战课程视频教程
4157 人在学
Redis有一个实用的slowlog功能,正如你可以猜到的,可以让你检查运行缓慢的查询.RedisShowlog是Redis用来记录查询执行时间的日志系统。
查询执行时间指的是不包括像客户端响应(talking)、发送回复等IO操作,而单单是执行一个查询命令所耗费的时间。
另外,slowlog保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启slowlog而损害Redis的速度。
redisslowlog概述
redis的slowlog记录了那些执行时间超过规定时长的请求。执行时间不包括I/O操作(比如与客户端进行网络通信等),只是命令的实际执行时间(期间线程会被阻塞,无法服务于其它请求)。
有两个参数用于配置slowlog:
slowlog-log-slower-than:设定执行时间,单位是毫秒,执行时长超过该时间的命令将会被记入log。-1表示不记录slowlog;0强制记录所有命令。
slowlog-max-len:slowlog的长度。最小值为0。如果日志队列已超出最大长度,则最早的记录会被从队列中清除。
可以通过编辑redis.conf文件配置以上两个参数。对运行中的redis,可以通过configget,configset命令动态改变上述两个参数
读取slowlog
slowlog是记录在内存中的,所以即使你记录所有的命令(将slowlog-log-slower-than设为0),对性能的影响也很小。
slowlogget:列出所有slowlog
slowloggetN:列出最近N条slowlog
语法
redisShowlog命令基本语法如下:
可用版本
>=2.2.12
返回值
取决于不同命令,返回不同的值。
Slowlog将会记录运行时间超过Y微秒的最后X条查询.X和Y可以在redis.conf或者在运行时通过CONFIG命令:
进行设置。
slowlog-log-slower-than是用来设置微秒数的,因此上面的设置将记录执行时间超过5秒的查询.要获取记录的日志,你可以使用SLOWLOGGETX命令,这里X是你想要获取的记录条数:
它将会展示一个唯一的id,时间戳和发生的查询,查询执行所花掉的时间和实际被执行的命令+参数.你可以通过SLOWLOGRESET擦出日志.
最后一次查看slowlog,我很不淡定的看到DEL命令的执行竟然花了超过20毫秒的时间.还记得吗,Redis是单线程的,因此这样会阻塞(并且严重的有碍)我们系统的并发.还有,因为这是一个写操作,它将会在向所有从属Redis服务复制的时候阻塞这一复制过程.额,到底这是咋回事呢?
也许除了我之外所有人都知道这个问题了,但是这证明了Redis的DEL命令的时间复杂度对于字符串和哈希值而言是O(1),而对于list、set和sortedset而言则是O(N)(这里的N是集合中数据项的数目).你会删除一个包含数百万条数据的set吗?那就等着阻塞吧.
我们的解决方案很简单:不去删除这些数据项,而是将它们重命名,并且在后台作业中用小而可间断的块去执行对它们的删除操作.首先,是我们的delayed_delete函数:
这将会将集合重命名,并且将新的名称添加到gc:set或者gc:zsetset中(我们没有使用list,但如果你使用了的话,你也应该向其加入这方面的支持).
下一步我们安排了一个Ruby脚本每分钟运行一次:
你可以基于自己的需要将修改数字.你的集合有多大,以及它们被删除有多频繁?因为我们不去太过频繁的做这些类型的产出操作,我们可以一次只进行一小块的删除操作.
不过这种方法比直接删除更加的慢,但它在并发的环境下却可以表现得很好.
实例
查看日志信息:
查看当前日志的数量:
使用命令SLOWLOGRESET可以清空slowlog
小编结语:
更多内容尽在课课家教育!