緩存擊穿、穿透、雪崩及Redis分布式鎖

分布式鎖: setnx ,redisson 并發問題
冪等問題: 落表狀態,Redis

緩存擊穿: 指緩存中無,db中有
原因: 一個key高并發恰好失效導致大量請求到db
方案: 加鎖,自旋鎖,或一個線程查db,一個線程監控(直接用Redisson分布式鎖)

緩存穿透:指緩存和db中均無
原因: 一般是惡意請求
方案: 加布隆過濾,或查db無時,也設置緩存,value為某些特殊表示或"null"

雪崩:指緩存同時大量失效
原因: 大量的key同時失效,db壓力加大
方案: 設置失效時間是增加隨機數

問題方案文獻:
http://www.lxweimin.com/p/31ab9b020cd9 (圖例分析)

https://blog.csdn.net/fcvtb/article/details/89478554

Redis分布式鎖:

  1. setnx
    直接使用setnx,業務執行完后del釋放鎖
    缺點: 若setnx成功, del釋放鎖失敗(服務不可用等),則該鎖永遠都不會被獲取到,從而導致造成死鎖
  2. setnx + expire 設置失效時間
    在1的基礎上優化; 先setnx獲取鎖,再expire對該鎖設置一個失效時間,到失效時間會自動釋放鎖
    缺點:
    -1. setnx + expire不是是兩個方法,不能保證原子性,故會出現setnx成功,expire失敗的情況,還是會導致不釋放鎖的問題
    -2. 可能會導致線程A釋放了線程B的鎖問題 (通過第4點解決)
  3. set k v ex tm nx (setnx + expire同時操作)
    在2.8版本后為set指令添加拓展參數ex和nx,保證了setnx + expire的原子性 例: set k v ex 100 nx
    缺點: 若在鎖的失效時間內,業務還未執行完,即鎖會導致提前釋放,則其他線程就可以獲取到鎖,從而導致超賣問題 (失效時間設置稍大,若有2.-2問題)
image.png
  1. 用業務id作為標識
    在使用setnx時value值設置為業務id作為標識,在釋放鎖是get key 對比value是否一致,是則釋放鎖,否則拋異?;貪L

事務未執行完鎖已到期釋放問題:使用Redissoin解決續租問題,內部已解決

分布式鎖文獻:
http://www.lxweimin.com/p/4838f8be00c9
https://blog.csdn.net/qq_30038111/article/details/90696233 (setnx + expire同時操作)

====================================

  1. Redis內存達90%以上可能出現的問題?
    -1. 使用了keys, 方案: scan代替keys(阻塞,導致短時間內Redis服務不可用,生產禁用)
    -2. 單個key value值過大,帶寬消耗嚴重
  2. 查看Redis命中率? 連接Redis info命令查看計算


    image.png

https://www.runoob.com/redis/keys-scan.html
http://www.lxweimin.com/p/611a492d9121Redis原理與應用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容