redis問題處理,經驗總結

本文章主在解決使用redis的過程中遇到的各種問題,以及經驗總結。(建議使用google搜尋)

1、解決保存快照失敗後redis無法寫入的問題。

工具/原料

伺服器一台

方法/步驟 解決保存快照失敗後redis無法寫入的問題。

最近redis服務總是不提供服務。經過一系列的測試(增大內存,取消redis的持久化服務,換伺服器,調整redis的內存分配模式,換redis的版本,),最終終於找的問題的所在,特寫出來給大家做參考。

redis中存在一個配置屬性stop-writes-on-bgsave-error,默認為yes。當bgsave保存失敗後,停止接收寫操作。當其他服務請求時,就會出現請求失敗。

解決方案:1,將配置屬性stop-writes-on-bgsave-error修改為no,重啟redis服務。

解決方案:2,取消redis持久化服務。如下:

save ""

#save 900 1

#save 300 10

#save 60 10000

解決方案:3,可以使用以下命令臨時讓redis申請內存成功(系統命令)

echo 1 > /proc/sys/vm/overcommit_memory

overcommit_memory解釋: vm.overcommit_memory 表示內核在分配內存時候做檢查的方式。這個變量可以取到0,1,2三個值。對取不同的值時的處理方式都定義在內核源碼 mm/mmap.c 的 __vm_enough_memory 函數中。 取 1 的時候: 此時宏為 OVERCOMMIT_ALWAYS,函數直接 return 0,分配成功。 取 2 的時候: 此時宏為 OVERCOMMIT_NEVER,內核計算:內存總量×vm.overcommit_ratio/100+SWAP 的總量,如果申請空間超過此數值,則分配失敗。vm.overcommit_ratio 的默認值為50。 取 0 的時候: 此時宏為 OVERCOMMIT_GUESS,內核計算:NR_FILE_PAGES 總量+SWAP總量+slab中可以釋放的內存總量,如果申請空間超過此數值,則將此數值與空閒內存總量減掉 totalreserve_pages(?) 的總量相加。 如果申請空間依然超過此數值,則分配失敗。

解決方案:4,解決緩存占用空間過大,導致redis持久化失敗的問題。

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場