問題現象
Redis可提供高效(xiao)的(de)數據(ju)庫服務,當內(nei)存(cun)不(bu)足時(shi),可能(neng)導致Key頻繁(fan)被(bei)逐出、響應時(shi)間上升(sheng)、QPS(每秒訪問(wen)次數)不(bu)穩定等問(wen)題,進(jin)而影響業務運行(xing)。由于Redis自身運行(xing)機(ji)制(主從同(tong)步(bu)、延(yan)遲釋(shi)放等),內(nei)存(cun)占用(yong)(yong)率可能(neng)出現略微超(chao)過100%的(de)情況(kuang)(kuang),此為正常(chang)情況(kuang)(kuang),此時(shi)內(nei)存(cun)已經寫滿,用(yong)(yong)戶需要考慮擴(kuo)容,或者清理一些無(wu)用(yong)(yong)的(de)數據(ju)。通常(chang)情況(kuang)(kuang)下(xia),當內(nei)存(cun)使用(yong)(yong)率超(chao)過95%時(shi)需要及時(shi)關注。
排查原因
- 查詢指定時段的內存使用率信息,具體操作請參見查看監控指標。“內存利用率”指標持續接近100%。
- 查詢內存使用率超過95%的時間段內,“已逐出的鍵數量”和“命令最大時延”,均呈現顯著上升趨勢,表明存在內存不足的問題。
建議客戶登錄控制臺,參考緩存分析和查詢Redis實例慢查詢,執行大(da)Key掃描和(he)慢查詢(xun)。如果實例(li)沒有設(she)置過期時間,會導致存儲數據太多,內(nei)存被占滿。
- Redis實例如果內存滿了但是key不多,可能原因是客戶端緩沖區(output buffer)占用過多的內存空間。
可以在Redis-cli客戶端連(lian)接實例后,執(zhi)行大key掃描命(ming)令:redis-cli --bigkeys,然后執(zhi)行info,查看output buffer占(zhan)用(yong)情(qing)況(kuang)。
處理措施
- 查找大key、熱key,方法如下:
- DCS控制臺提供了大Key和熱Key的分析功能,你可參考緩存分析減少大key和熱key。
- 通過redis-cli的bigkeys和hotkeys參數查找大Key和熱Key:
Redis-cli提供了bigkeys參數,能夠使redis-cli以遍歷的方式分析Redis實例中的所有Key,并返回Key的整體統計信息與每個數據類型中Top1的大Key,bigkeys僅能分析并輸入六種數據類型(STRING、LIST、HASH、SET、ZSET、STREAM),命令示例為: redis-cli -h <實例的連接地址> -p <端口> -a <密碼> --bigkeys 。
自Redis 4.0版本起,redis-cli提供了hotkeys參數,可以快速幫您找出業務中的熱Key,該命令需要在業務實際運行期間執行,以統計運行期間的熱Key。命令示例為: redis-cli -h <實例的連接地址> -p <端口> -a <密碼> --hotkeys 。熱Key的(de)詳情可(ke)以(yi)在結果(guo)中的(de)summary部(bu)分獲取到。
- 提前發現大key、熱key。
如(ru)果某(mou)個節(jie)點存在熱key,這個節(jie)點的帶寬占(zhan)用(yong)、CPU利(li)用(yong)率都比(bi)其他(ta)節(jie)點高,該(gai)節(jie)點會容易觸(chu)發告警,便(bian)于您發現潛在熱key。
說明
由于Redis 3.0實(shi)例不支持熱(re)key分析,您(nin)可以使用該方(fang)式(shi)幫助您(nin)發現熱(re)key。
-
其他優化建議:
- string類型控制在10KB以內 ,hash、list、set、zset 元素盡量不超過5000 。
- key的命名前綴為業務縮寫,禁止包含特殊字符(比如空格、換行、單雙引號以及其他轉義字符)。
- Redis事務功能較弱,不建議過多使用。
- 短連接性能差,推薦使用帶有連接池的客戶端。
- 如果只是用于數據緩存,容忍數據丟失,建議關閉持久化。
-
如果實例內存使用率通過以上方式仍然很高,請考慮在業務低峰期擴大實例規格。具體操作請參見變更實例規格。