遇到比較尷尬的項目是難免的,質量真是亂的一批,對於redis的使用也是亂用,那麼就會有一個問題,內存撐不住怎麼辦?
不是高可用,只有一個裸redis(高可用方案下次再說)
目錄
分析步驟
進入redis,查看內存使用情況
redis -a 密碼
info memory
服務器分配了5G內存,maxmemory爲5G,可用4.66G,發生OOM的時候已經全部用完;詳細分析可以專門問下度娘
OOM緊急解決方案:
提高最大內存,config set maxmemory xxx
設置內存淘汰策略:我設置爲allkeys-lru
Redis5.0定義了幾種策略用來處理這種情況:
(1)volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰。
(2)volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰。
(3)volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰。
(4)volatile-lfu:從已設置過期時間的數據集挑選使用頻率最低的數據淘汰。
(5)allkeys-lru:從數據集中挑選最近最少使用的數據淘汰
(6)allkeys-lfu:從數據集中挑選使用頻率最低的數據淘汰。
(7)allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
(8) no-enviction(驅逐):禁止驅逐數據,這也是默認策略。意思是當內存不足以容納新入數據時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,採用no-enviction策略可以保證數據不被丟失。
這八種大體上可以分爲4中,lru、lfu、random、ttl。
當使用volatile-lru、volatile-random、volatile-ttl這三種策略時,如果沒有key可以被淘汰,則和noeviction一樣返回錯誤
但是這只是臨時方案,需要知道根本原因是什麼
問題:爲什麼5G還不夠用?肯定是有大key,或者使用過多,沒有設置過期時間
好了,1. 找出大key,2. 減少沒有必要的緩存,3. 必須設置過期時間
如何找大key
網上搜了半天有用工具,有用python,有用命令的;感興趣大家可以看下這篇文章還可以:https://www.cnblogs.com/yqzc/p/12425533.html
這裏我介紹一下用rdbtools分析感覺還蠻方便的
安裝rdbtools
pip install rdbtools 安裝
如果沒有安裝pip則安裝pip,教程請看:https://blog.csdn.net/Goligory/article/details/106033972
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
python setup.py install
安裝如下
使用 redis-rdb-tools 生成內存快照:
rdb -c memory dump.rdb > memory.csv
這時候可能找不到dump.rdb
解決辦法:
登錄redis
命令:save
命令(找到安裝目錄):config get dir
退出,cd到安裝目錄就看到dump.rdb了
在有dump.rdb目錄下執行:rdb -c memory dump.rdb > memory.csv 即可,csv文件就在當前文件夾,可以導出來直接查看,效果如下
也可以用SQLite分析csv文件,這裏在這裏不說了,感興趣可以問度娘
參考:https://www.cnblogs.com/aresxin/p/9014617.html