1. 程式人生 > >memcache快取雪崩、快取無底洞、快取穿透、永久資料被踢現象

memcache快取雪崩、快取無底洞、快取穿透、永久資料被踢現象

一.快取雪崩現象

  快取雪崩一般是由某個快取節點失效,導致其他節點的快取命中率下降, 快取中缺失的資料去資料庫查詢,短時間內造成資料庫伺服器崩潰,

    重啟DB短期又被壓跨,但新資料的快取也更新一些,DB反覆多次啟動多次,快取重建完畢,DB才穩定執行,或者是由於快取週期性的失效,比如快取失效週期相同,在一個時間點快取同時失效,將有一個請求”峰值”, 嚴重者甚至會令DB崩潰

  解決方案:把快取設定為不同的生命週期,這樣不同時失效,把工作分擔到各個時間點上去,也可以自己寫指令碼,放到業務比較空閒的時候自己重新整理建立快取,比如放到凌晨時分

 

二.快取的無底洞現象 multiget-hole

  memcached的節點非常多,memcached 連線頻率、效率下降,於是增加 memcached 節點, 發現因為連線頻率導致的問題仍然存在稱之為”無底洞現象”

  以使用者資訊為例: 一個使用者有很多的資訊,user1-age, user1-name,user1-height ,當伺服器增多,使用者的資訊也被散落在更多的節點,user1-age在一個節點,user1-name在第二個節點上,user1-height在第三個節點上,

     這時候同樣是獲取這個人的使用者資訊就要連線多個節點,節點越多要連線的節點也越多. 對於memcached的連線數,並沒有隨著節點的增多,而降低於是問題出現

     解決方案:在儲存使用者資訊的時候key鍵使用共同的字首進行儲存,如使用user1作為鍵,而不是user1-age為一個鍵,user1-name為一個鍵...

 

三.快取穿透現象

  在按照key去快取查詢一個一定不存在的資料,由於快取未命中需要從資料庫查詢,資料庫未查到資料也不做快取,並且對該key併發請求量很大,就會對系統造成很大的壓力,這就是快取穿透

  解決方案:當查詢返回的資料為空時,我們仍然把這個空結果進行快取並設定一個相對較短的生命週期

 

四.永久資料被踢現象

  快取資料時已經設為永久有效,卻莫名其妙的丟失了,這種現象是因為memcache的惰性刪除機制,即LRU最近最少使用刪除機制,

  當某個單元被請求時,memcache維護一個計數器,通過計數器來判斷最近最少被使用的是誰就把誰踢出,即使是永久有效的資料,如果一直沒有被使用,而庫又滿了的情況下,就會把這個永久資料踢出

  解決方案:永久資料和非永久資料分開存放