在操作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"