Redis 26 快取穿透 擊穿 雪崩 一致性

2021-10-25 10:46:39 字數 1223 閱讀 1160

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...