Redis實戰(八):面試常問:擊穿,穿透,雪崩,分佈式鎖,API(jedis,luttce,springboot:low/high level)

緩存擊穿

作爲緩存,受到內存大小限制,可能:

  • key 超過了過期時間
  • key 被 LRU LFU 清掉了

因爲某些 key 不在 redis 裏面了,大量併發來找這個 key 的時候,這時候客戶端去直接請求數據庫,這就是擊穿

這個問題怎麼解決?
只要發現某個key不存在,就讓所有對這個key的請求去搶一把鎖。也就是說,
讓第一個找key的請求,執行一個setnx,類似於放一把鎖。只有獲得鎖的人才能去數據庫查,其他的請求讓它們失敗,sleep等待幾秒鐘之後,重新去 redis 取數據。

這會存在一個問題:
1、如果第一個拿到鎖的人掛了,別人也拿不到鎖,這樣就死鎖了。可以設置鎖的過期時間來避免這個問題。
2、由於我設置了過期時間,可能會發生這樣的情況:拿到鎖的人沒掛,但是可能由於網絡擁塞或者數據庫擁塞,鎖超時了,又有一個人拿到這個鎖,又去數據庫取,更加擁塞了。
針對這個問題,可以開啓多個線程,一個線程去庫裏取數據,另一個線程去給鎖的超時時間延長。這樣會讓代碼邏輯變得複雜。
3、像上面這樣,你自己去實現分佈式協調很麻煩。因此我們引入Zokeeper,這個以後再講~
在這裏插入圖片描述

緩存穿透

從業務接收查詢的,是你係統裏面根本不存在的數據。這就是緩存穿透。

怎麼解決?
1、使用布隆過濾器

  • 你可以在客戶端中包含布隆過濾器的算法
  • 你可以在客戶端只包含算法,在redis中存放bitmap
  • 你可以直接在redis中集成布隆模塊:RedisBloom模塊

布隆過濾器的缺點:只能增加,不能刪除,如果你的業務刪除了數據庫中的某條數據,無法在布隆過濾器中刪除這個key
解決方式:你可以使用布穀鳥過濾器等其他支持刪除操作的過濾器,或者設置一個空 key

在這裏插入圖片描述

緩存雪崩

和擊穿有些類似,都是後面有數據的情況。
大量 key 同時失效,間接造成大量的訪問到達 DB

怎麼解決?
要考慮兩種情況:
1、每天都要更新數據的情況,例如每天零點要刷新緩存。這時候可以依賴擊穿的解決方案。或者在業務層加一個小延時:判斷如果是零點就延時,隨機sleep幾秒,這樣不會把流量一大波流量同時放過來。
對於能夠提前預知的時點數據,比如京東雙11的頁面樣式、圖片等,可以提前推到客戶端本地,到雙11零點的時候直接切換即可。
2、與時點性無關(並不需要在某個時間刷新緩存)的話,可以設置隨機過期時間。

Redis做分佈式鎖

1、setnx
2、過期時間
3、多線程(守護線程)延長過期時間

可以使用j ava Sedisson API
也可以用 zookeeper 做分佈式鎖,這樣是最容易的。雖然zookeeper沒有redis快,但是比redis能夠加強準確性。

API

redis 支持大多數語言,因此它二進制安全保證了數據在跨語言的時候不會出問題
在這裏插入圖片描述
可以查看所有配置項
在這裏插入圖片描述

spring redis 文檔
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章