redis的三種常見的使用問題
快取穿透(快取的資料db中不存在,快取中也不存在。但是高頻次的無結果查詢全部落在db上,從而影響db效能)
快取擊穿(當熱點資料發生過期時。高頻次的訪問全部落在db上,從而影響db效能)
快取雪崩(和快取穿透相似。很多的熱點資料同一時間過期。)
1.快取空值:
針對空結果查詢進行資料快取,將空結果存入快取中(設定乙個較短的隨機過期時間)。
2.布隆過濾器:
是一種較為特殊的資料結構。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都比一般的演算法要好的多,缺點是有一定的誤識別率和刪除困難。
布隆過濾器的簡單介紹:他是將每乙個key進行hash 演算法的,然後存入乙個二進位制陣列當中。
舉例:(假設我們這個布隆過濾器的二進位制陣列只有10個長度)
2.加鎖:當快取過期時,增加分布式鎖。來確保在多個訪問中只有乙個請求可以請求到db,其餘的請求等待快取更新後再次獲取快取,來確保db的安全。這個做法也有很多的缺點,當訪問db 的時候其他的請求都在等待,這樣的使用者感受就很不友好。並且,如此多的請求堆積,還可能引起更多莫名其妙的問題,例如oom等等。(不推薦)
4.加鎖+二級快取:針對熱點資料增加兩個快取。一級快取可以按照快取的正常過期時間相對縮短一點,二級快取(可以根據需求判斷是否允許支援短暫的快取不一致,來決定快取的時間長短)設定乙個長於一級快取的時間。當一級快取過期時,進行新增分布式鎖,來保證只有一次db的訪問,然後同時更新兩級快取。其他的未獲得鎖的訪問直接訪問二級快取。(推薦)
首先需要借助快取擊穿,解決方案。針對熱點資料進行二級快取和加鎖,防止影響db。
然後針對大部分快取的集中性過期,進行分散過期時間。對快取的正常過期時間,增加隨機數。來確保快取的分散性過期。
Redis擊穿,傳統,雪崩和預熱
問題 快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向 持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了 持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候就相當於出現了快取穿透。這裡需要注...
redis 快取穿透 擊穿 雪崩
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...
redis快取穿透,擊穿,雪崩
快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的k...