分布式鎖: 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分布式鎖:
- setnx
直接使用setnx,業務執行完后del釋放鎖
缺點: 若setnx成功, del釋放鎖失敗(服務不可用等),則該鎖永遠都不會被獲取到,從而導致造成死鎖 - setnx + expire 設置失效時間
在1的基礎上優化; 先setnx獲取鎖,再expire對該鎖設置一個失效時間,到失效時間會自動釋放鎖
缺點:
-1. setnx + expire不是是兩個方法,不能保證原子性,故會出現setnx成功,expire失敗的情況,還是會導致不釋放鎖的問題
-2. 可能會導致線程A釋放了線程B的鎖問題 (通過第4點解決) - 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
- 用業務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同時操作)
====================================
- Redis內存達90%以上可能出現的問題?
-1. 使用了keys, 方案: scan代替keys(阻塞,導致短時間內Redis服務不可用,生產禁用)
-2. 單個key value值過大,帶寬消耗嚴重 -
查看Redis命中率? 連接Redis info命令查看計算
image.png
https://www.runoob.com/redis/keys-scan.html
http://www.lxweimin.com/p/611a492d9121Redis原理與應用