布隆过滤器Redis缓存穿透雪崩击穿热点key
目錄
- 布隆過濾器
- Redis 緩存
- 穿透
- 雪崩
- 擊穿
- 熱點KEY
布隆過濾器
布隆過濾器(判斷某個key一定不存在)
布隆過濾器的使用:
- 布隆過濾器在NoSQL數據庫領域中應用的非常廣泛
- 當用戶來查詢某一個row時,可以先通過內存中的布隆過濾器過濾掉大量不存在的row請求,然后去再磁盤進行查詢
- 布隆過濾器說某個值不存在時,那肯定就是不存在,可以顯著降低數據庫IO請求數量
應用場景
- 場景1(給用戶推薦新聞)
- 場景2(爬蟲url去重)
布隆過濾器原理
添加:值到布隆過濾器
查詢:布隆過濾器值
刪除:不支持
Redis 緩存
客戶端請求在緩存層命中直接返回內容,如果Miss就去存儲層讀取,存儲層讀取到數據再寫入緩存層,然后再返回客戶端。
優點:
- 加速讀寫效率
- 降低后端負載
- 減少存儲層壓力
缺點:
- 數據不能保證一致性
- 代碼維護成本和運維成本
主從復制
- 主節點數據更新后根據配置和策略,自動同步到備節點的master/slaver的機制
- 主節點負責寫數據,從節點負責讀數據
- 主節點定期把數據同步到從節點保證數據的一致性
優點:
- 讀寫分離
- 容災恢復
缺點:
- 主從復制,若主節點出現問題,則不能提供服務,需要人工修改配置將從變主
- 主從復制主節點的寫能力單一,能力有限
- 單機節點的存儲能力也有限
穿透
定義
解決方法 :布隆過濾
- 對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,將所有可能存在的數據哈希到一個足夠發的 bigmap 中
- 一個一定不存在的數據會被該 bigmap 攔截掉,從而避免對底層存儲系統造成查詢壓力
- 【推薦】如果一個查詢返回的數據為空(無論數據為空,或是系統故障),將空結果進行緩存,設置一個最長不超過五分鐘的過期時間。這樣過期時間內查詢的時候就會直接在緩存層獲取,并直接返回null
雪崩
定義
解決方法
- 哨兵
- 主服務器宕機,從服務器會主動切換成主服務器
- 事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。
- 事中:本地 ehcache 緩存 + hystrix 限流&降級,避免 MySQL 被打死。
- 事后:redis 持久化,一旦重啟,自動從磁盤上加載數據,快速恢復緩存數據。
擊穿
定義:
解決方法
- 解決方式也很簡單,可以將熱點數據設置為永遠不過期
- 或者基于 redis or zookeeper 實現互斥鎖,等待第一個請求構建完緩存之后,再釋放鎖,進而其它請求才能通過該 key 訪問數據
熱點KEY
熱點問題產生的原因大致有以下兩種:
- 用戶消費的數據遠大于生產的數據(熱賣商品、熱點新聞、熱點評論、明星直播)
在日常工作生活中一些突發的的事件,例如:
雙十一期間某些熱門商品的降價促銷,當這其中的某一件商品被數萬次點擊瀏覽或者購買時,會形成一個較大的需求量,這種情況下就會造成熱點問題。
同理,被大量刊發、瀏覽的熱點新聞、熱點評論、明星直播等,這些典型的讀多寫少的場景也會產生熱點問題
- 請求分片集中,超過單 Server 的性能極限
在服務端讀數據進行訪問時,往往會對數據進行分片切分
此過程中會在某一主機 Server 上對相應的 Key 進行訪問,當訪問超過 Server 極限時,就會導致熱點 Key 問題的產生
熱點問題的危害
? 流量集中,達到物理網卡上限。
? 請求過多,緩存分片服務被打垮。
? DB 擊穿,引起業務雪崩。
如何解決熱點key的問題
利用二級緩存
比如利用 ehcache ,或者一個 HashMap 都可以。在你發現熱key以后,把熱key加載到系統的JVM中。
針對這種熱key請求,會直接從jvm中取,而不會走到redis層。
假設此時有十萬個針對同一個key的請求過來,如果沒有本地緩存,這十萬個請求就直接懟到同一臺redis上了。
現在假設,你的應用層有50臺機器,OK,你也有jvm緩存了。這十萬個請求平均分散開來,每個機器有2000個請求,會從JVM中取到value值,然后返回數據。避免了十萬個請求懟到同一臺redis上的情形。
(2)備份熱key
這個方案也很簡單。不要讓key走到同一臺redis上不就行了。我們把這個key,在多個redis上都存一份不就好了。接下來,有熱key請求進來的時候,我們就在有備份的redis上隨機選取一臺,進行訪問取值,返回數據。
- 來自于參考博客
- 參考博客鏈接
總結
以上是生活随笔為你收集整理的布隆过滤器Redis缓存穿透雪崩击穿热点key的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker基础篇
- 下一篇: WebsocketWebSSH