記錄一次Redis的小事故
阿新 • • 發佈:2020-12-21
技術標籤:PHP專欄和Swoole的相關技術redisoom commandredis策略
因為公司做的業務流量比較大,一直沒有太關注Redis的使用情況。昨天就出現了:
Redis: OOM command not allowed when used memory > ‘maxmemory’
OOM command not allowed when used memory > 'maxmemory'
查了一下原因:記憶體已滿,不允許再存資料了。可以通過redis-cli 檢視redis的具體資訊,使用:info memory命令檢視使用情況。我登入我的後臺檢視的是這樣的:
於是乎放在我面前的只有三條路:
1.修改Redis的配置達到資料的實際操作性。
2.擴大容量
3.在Redis中儲存更少的資料
注:如修改了配置檔案需重啟redis
1. 增加redis記憶體,修改redis.conf
maxmemory 32gb
2. 修改redis儲存策略
預設的redis設定是非常保守的,即記憶體超限後就不在儲存,可以把策略修改為LRU演算法(最近最少使用演算法)——新儲存的資訊會替換掉舊的資訊,從而不會是記憶體越線,修改redis.conf
maxmemory-policy volatile-lru
若配置檔案中,最大記憶體的策略設定為 maxmemory-policy volatile-lru 此配置只是清楚設定過期時間的key值,然而本應用並沒有設定過期時間。
可以修改為maxmemory-policy allkeys-lru,指明非活躍近期很少用的key值清除。
這樣我們就可以通過設計篩選條件來篩選資料。
# In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving at all commenting all the save lines. save 900 1 save 300 10 save 60 10000
考慮到上面的情況,設定不同的策略有可能意味著Redis例項中會出現資料的丟失。
3.在Redis中儲存更少的資料:
也許你會說這是多麼愚蠢的解決方案。但是問問你自己:你儲存的Redis所有的東西都是真的需要的嗎?或者你使用Redis作為快取解決方案,只是儲存了太多資料在裡面。如果你的sql查詢返回十列。但實際你通常只需要其中的三列。那麼只需要儲存這3個值而不是全部的十個值。
最終考慮到實時性,我們就進行了擴容。後續對快取進行優化的決策。
寫下來這個小事故,給大家遇到同樣的問題可以參考。