把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下:
(一)快取和資料庫間資料一致性問題
分布式環境下(單機就不用說了)非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,那麼請不要使用快取。我們只能採取合適的策略來降低快取和資料庫間資料不一致的概率,而無法保證兩者間的強一致性。合適的策略包括 合適的快取更新策略,更新資料庫後要及時更新快取、快取失敗時增加重試機制,例如mq模式的訊息佇列。
(二)快取擊穿問題
快取擊穿表示惡意使用者模擬請求很多快取中不存在的資料,由於快取中都沒有,導致這些請求短時間內直接落在了資料庫上,導致資料庫異常。這個我們在實際專案就遇到了,有些搶購活動、秒殺活動的介面api被大量的惡意使用者刷,導致短時間內資料庫宕機了,好在資料庫是多主多從的,hold住了。
解決方案的話:
1、使用互斥鎖排隊
業界比價普遍的一種做法,即根據key獲取value值為空時,鎖上,從資料庫中load資料後再釋放鎖。若其它執行緒獲取鎖失敗,則等待一段時間後重試。這裡要注意,分布式環境中要使用分布式鎖,單機的話用普通的鎖(synchronized、lock)就夠了。
public string getwithlock(string key, jedis jedis, string lockkey, string uniqueid, long expiretime) else
} catch (exception e) finally
}return value;
}
這樣做思路比較清晰,也從一定程度上減輕資料庫壓力,但是鎖機制使得邏輯的複雜度增加,吞吐量也降低了,有點治標不治本。
(三)快取雪崩問題
快取在同一時間內大量鍵過期(失效),接著來的一大波請求瞬間都落在了資料庫中導致連線異常。
解決方案:
1、也是像解決快取穿透一樣加鎖排隊,實現同上;
2、建立備份快取,快取a和快取b,a設定超時時間,b不設值超時時間,先從a讀快取,a沒有讀b,並且更新a快取和b快取;
public string getbykey(string keya,string keyb)
return value;
}
(四)快取併發問題 Redis 快取穿透 快取雪崩
目錄 1.快取穿透 如何避免?如何選擇?2 快取擊穿 如何解決 3.快取雪崩 如何解決?快取穿透 一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力,或導致資料庫異常。...
redis快取穿透 快取雪崩
什麼是快取雪崩 在同一時間內大量的快取資料失效,大量的請求都會去資料庫查詢,造成快取雪崩。解決方法 這個沒有完美的解決方法,但是可以分析使用者行為,盡量讓失效時間點均勻分布,還有就是在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,比如對某國key只允許乙個執行緒查詢資料庫和快取,其他...
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...