1.使用大併發訪問不存在的key
2.使用大併發訪問很多不存在的key
對於1可以快取不存在的key,這樣以後這個key存在了就不一致了
對於2使用布隆過濾器,谷歌的jar包和redis的兩種,jar包的會再每個jvm中都儲存乙份
布隆過濾器資料結構是乙個很長的位陣列
應用啟動時把所有的值通過幾個不同的hash函式算出來hash值和陣列長度做與運算把對應位位設定成1
查詢時,先做次hash執行,檢視是否都為1,如果都為1說明存在,如果有乙個不存在說明不存在
需要定期重新構建資料結構
1.熱點key值失效,大量請求打到mysql
2.批量快取可以失效,大量請求打到mysql
對於批量快取失效設計隨機的過期時間
對於熱點key快取失效,使用分布式鎖,沒有獲取鎖的執行緒做個自旋,獲取鎖後再從redis獲取一次
1.使用高可用的集群
2.使用雙活、或者熱備份,故障切換到另外乙個機房
3.對非核心業務使用降級 hystrix、sentinel
使用修改的方案
例如:a、c乙個執行緒
b、d乙個執行緒
快取中正確的結果應該是b寫資料庫的結果10
但是因為並行執行導致快取中的結果是6
a寫資料庫 6
b寫資料庫 10
d修改快取 10
c修改快取 6
使用刪除的方案
a寫資料庫6
c刪除快取6
e讀快取為空,從資料庫中獲取6
b寫資料庫 10
d刪除快取 10
f寫快取為6
方案1:
如果業務允許一定時間不一致,可以使用設定過期時間,允許再過期時間範圍內可以能不一直
方案2:
延時雙刪
使用mq的延時佇列,傳送mq,等一定的時間刪除快取重建
方案3:
監聽mysql的binlog日誌,同步寫到redis快取中
16k
方案4:
使用redisson的讀寫鎖,對讀取操作加讀鎖,對寫操作加寫鎖
Redis快取穿透,穿透擊穿,快取雪崩
乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...
redis 快取穿透 擊穿 雪崩
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...
redis快取穿透,擊穿,雪崩
快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的k...