確定問題
1、查看 Redis 的響應延遲。
2、基於當前環境下的 Redis 基線性能做判斷
基線性能是系統在低壓力、無干擾下的基本性能,Redis 運行時延遲是其基線性能的 2 倍及以上,可認定 Redis 變慢了。
問題定位
1、通過 Redis 日志,或者是 latency monitor 工具,查詢變慢的請求,確認是否采用了復雜度高的慢查詢命令。
2、檢查業務代碼在使用 EXPIREAT 命令設置 key 過期時間時,是否使用了相同的 UNIX 時間戳,有沒有使用 EXPIRE 命令給批量的 key 設置相同的過期秒數。從而造成大量 key 在同一時間過期,導致性能變慢。刪除操作是阻塞的(Redis 4.0 后可以用異步線程機制來減少阻塞影響)
3、檢查是否使用了慢查詢命令,KEYS *xxx
優化
1.a.用其他高效命令代替。比如說,如果你需要返回一個 SET 中的所有成員時,不要使用 SMEMBERS 命令,而是要使用 SSCAN 多次迭代返回,避免一次返回大量數據,造成線程阻塞。
1.b.當你需要執行排序、交集、並集操作時,可以在客戶端完成,而不要用 SORT、SUNION、SINTER 這些命令,以免拖慢 Redis 實例。
2.如果一批 key 的確是同時過期,你還可以在 EXPIREAT 和 EXPIRE 的過期時間參數上,加上一個一定大小范圍內的隨機數
3.獲取整個實例的所有key,建議使用SCAN命令代替。客戶端通過執行SCAN $cursor COUNT \(count可以得到一批key以及下一個游標\)cursor,然后把這個\(cursor當作SCAN的參數,再次執行,以此往復,直到返回的\)cursor為0時,就把整個實例中的所有key遍歷出來了。