Redis使用場景常見問題
緩存
緩存三兄弟(穿透,擊穿,雪崩)
雙寫一致
持久化
數據過期策略
數據淘汰策略
分布式鎖
setnx,redisson
消息隊列,延遲隊列
…
解決Redis緩存穿透問題
緩存穿透問題
請求->redis緩存->mysql數據庫
當一個新請求到來時,先會訪問redis緩存尋找數據,如果在緩存中沒有找到數據,就會去數據庫中尋找,找到后將數據緩存到redis
當查詢一個不存在的數據時,數據庫中找不到數據,也就不會在緩存中寫入,即導致每次請求都會查找數據庫
如果出現大量的類似請求,就會頻繁地沖擊數據庫,導致數據庫宕機(攻擊)
緩存傳透簡而概之就是請求穿透了redis緩存直接沖擊數據庫
緩存穿透的解決方案
緩存空數據
即使查詢數據庫返回的數據為空,仍然對這個空結果進行緩存
這種方法雖然簡單,但是存在問題
首先是消耗內存,即使查詢不存在的數據也進行緩存
其次是可能出現不一致的問題
當數據庫中的不存在的數據被賦值時,緩存中的數據仍然為空,即數據庫和緩存數據不一致
布隆過濾器
在向redis查詢數據之前,會先查詢布隆過濾器
如果在布隆過濾器中不存在,那就會直接返回
在緩存預熱時,需要先預熱布隆過濾器
bitmap(位圖)
一個以bit為單位的數組,數組中的每個單元只能存儲二進制數0或1
存儲數據:
每個數據通過三個不同的hash函數獲取hash值,根據hash值的計算結果將數組的對應位置改為1
每次查詢時,使用相同的hash函數進行計算,如果相同的數組位置都為1即代表存在,可以放行,如果不存在就直接返回
數組越大誤判率越低,數組越小誤判率越高
一般在5%以內,數據庫可以接受
RBloomFilter<String> bloomFilter
bloomFilter.tryInit(size,0.05);
//在布隆過濾器初始化數據,誤判率設置為0.05