Redis記憶體使用量達到maxmemory設定值後玩家資料無法寫入解決
先說說我們公司這邊的redis應用情境。目前線上的遊戲是採用redis作為MongoDB的前端緩衝,儲存一些玩家需要經常訪問的資料,同時遊戲的運營公告資訊以及BI相關採集資料也存放在redis中。在上周五,運營同事反映在某個合作方的遊戲後台添加了遊戲運營公告,但是進入遊戲後卻無法看到公告更新。同時,也有玩家反映遊戲相關的活動獎勵,遊戲熱門排行榜等資訊沒有更新。通過和開發同事溝通,初步判斷是redis無法寫入的問題。由於合作方之前一直沒有提供redis伺服器的存取權限,只有redis執行個體的許可權。通過查看之前讓合作方營運同事提供的redis配置參數,發現他們設定了maxmemory 2G 限定了單個redis執行個體最大使用記憶體為2G。我勒個去,這個坑可大了,由於之前對redis營運方面沒有作深入研究,也沒有仔細核對對方營運的redis配置參數。結果這次就坑大了。我們有接近10個區的資料都寫入了這個執行個體中。再進入redis執行個體中,使用info 命令查看used_memory_human:1.98G 差不多達到了最大值,難怪更新了後台公告,遊戲內卻無法顯示。然後聯絡對方營運調整maxmemory參數,一切恢複正常,運營那邊又得制定玩家賠償方案了。
redis的相關配置參考資訊直接可以通過redis.conf檔案查看,在這個檔案中關於redis的常規配置已經解釋得比較清楚了。這裡主要講解一下maxmemory相關的說明。
如果設定了maxmemory,使用redis的時候,redis的記憶體使用量量不能超過設定的值,一旦redis的記憶體使用量量達到了最大值,redis將會嘗試按照選擇的eviction policy(回收策略)移除相應的keys
如果redis不能根據回收策略移除keys,或者回收原則設定成noeviction,那麼redis將對需要寫操作的命令返回錯誤資訊,如SET,LPUSH操作,對GET這樣的唯讀操作會繼續響應。
在redis.conf中給出了一個警告資訊,如果一個設定了maxmemory的執行個體串連了從redis,那麼預留給redis使用的記憶體除了redis執行個體本身佔用的記憶體外還要加上用於主從複製的輸出緩衝區大小(the output buffers need to feed the slaves),這樣,才不會觸發移除keys的死迴圈,因為當記憶體達到最大記憶體限制後,會根據eviction policy移除相應的keys,這時,從redis也會同步移除keys操作,最終所有資料都被清空。
總之,一句話,對一個串連了從redis的redis執行個體設定maxmemory時,建議設定一個較高的值,使系統有多餘的記憶體用於主從同步,當然,如果eviction policy設定成noevcition,則不需要這麼設定。
Ubuntu 14.04下Redis安裝及簡單測試
Redis叢集明細文檔
Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis
Redis系列-安裝部署維護篇
CentOS 6.3安裝Redis
Redis安裝部署學習筆記
Redis設定檔redis.conf 詳解
Redis 的詳細介紹:請點這裡
Redis 的:請點這裡
本文永久更新連結地址: