在操作Redis时要时刻记得Redis是单线程操作,如果有耗时的操作,会阻塞其他的操作。
上周四晚上开始钉钉群里Redis开始报警,不是很多,一晚上报了有个几十条。数据(非大Key)写入Redis失败了。周五开始排查问题。个人认为周五上线和周五出BUG是最不爽的~
开发平台是.net , 使用的是StackExchange.Redis来操作Redis。
在服务器上调用API返回错误信息如下:
"ExceptionMessage":"Timeout performing。。。感觉这个错误信息和OOM时显示的信息一样,显示的错误位置和实际的错误位置根本没有关系。还好里面还显示了一个地址:https://stackexchange.github.io/StackExchange.Redis/Timeouts。里面详细介绍了可能会导致Redis操作超时的原因,这样就可以排查问题的具体点了。导致超时的原因是:List中的数据量到了几十万,在删除时耗时比较久。阻塞了其他的操作。
比较快的方法是通过Redis的slowlog命令来查看那个操作耗时较高。https://redis.io/commands/slowlog
redis> SLOWLOG GET 1) 1) (integer) 12 # 唯一性(unique)的日志标识符 2) (integer) 1324097834 # 被记录命令的执行时间点,以 UNIX 时间戳格式表示 3) (integer) 16 # 查询执行时间,以微秒为单位 4) 1) "CONFIG" # 执行的命令,以数组的形式排列 2) "GET" # 这里完整的命令是 CONFIG GET slowlog-log-slower-than 3) "slowlog-log-slower-than"