【自我學習1】使用REDIS解決高并發時常遇到的問題。
參數傳入對象主鍵ID根據key從緩存中獲取對象
如果對象不為空,直接返回
如果對象為空,進行數據庫查詢
如果從數據庫查詢出的對象不為空,則放入緩存(設定過期時間)
REDIS緩存穿透:
問題現象:如果傳入的參數為-1,會是怎么樣?這個-1,就是一定不存在的對象。就會每次都去查詢數據庫,而每次查詢都是空,每次又都不會進行緩存。假如有惡意攻擊,就可以利用這個漏洞,對數據庫造成壓力,甚至壓垮數據庫。即便是采用UUID,也是很容易找到一個不存在的KEY,進行攻擊。
解決方法:查詢對象為空,也當做是有值,放入緩存中(只不過這個過期時間設置短一點)
REDIS緩存雪崩:
問題現象:某個時間,緩存集中過期失效。
解決方法:正對不通分類產品,緩存不同周期,再加上隨機因子,可以節省內存資源的情況下,可以緩解這種現象
REDIS緩存擊穿:
問題現象:指一個Key非常熱,不停地扛著巨大的并發,大并發集中對于這個點進行訪問,當這個Key失效的瞬間,持續的高并發就能穿破緩存,直接請求數據庫,相當于戴森球有個洞。
解決方法:粗略簡單的方法,就是將主打商品緩存永不過期,只要機能夠用內存換取安寧,大道至簡。
使用互斥鎖(mutex key):
業界比較常用的做法,是使用mutex。
在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,
而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key
當操作返回成功時,再進行load db的操作并回設緩存
否則,就重試整個get緩存的方法。

浙公網安備 33010602011771號