高併發分散式鎖--Redis之Redisson和優化
阿新 • • 發佈:2020-10-15
拒絕東扯西扯,直接上乾貨
這裡只講原理,如果想了解redisson使用過程的請看看Redisson的官網。
優勢
redisson分散式鎖優勢:
- 多個redis操作亂指令碼整體提交,保證效能同時,保證整體原子性!
- 看門狗自動延續鎖生命週期,防止未處理完鎖過期問題,但是同時造成了阻塞,甚至鎖死
- 實現了自旋鎖 :發現鎖後get ttl進行while true對應的時間
- 實現了重入鎖 :發現鎖後再看一下clientid是不是自己,如果是+1
原理
redisson分散式鎖使用例子:
1 2 3 4 5 | RLock lock = redisson.getLock("myLock"); //加鎖 lock.lock(); // 解鎖 lock.unlock(); |
架構圖:
lua指令碼流程圖
lua加鎖指令碼原始碼:
redisson分散式鎖 問題:
自多續期怎麼防止長期阻塞,甚至死鎖,這裡大家思考一下,歡迎留言
優化
高效能分散式鎖優化( 核心思想:分段)
分段鎖:我們常用的是按商品,按商家等進行分段;但是在秒殺的時候,秒的就是一個商品,那麼我們怎麼進行分散式鎖優化呢? 思考一下。。。。
如果我們鎖的是商品庫存,防止超賣問題,那麼我們的思路是,把庫存數量 分段:
1000分成20段,那每段就是50個庫存。
這樣我們的鎖 鎖的是 一個庫存段, 就能對同一個商品的多個庫存段實現分段鎖,實現同一個商品的併發
問題:如果秒殺的鎖並不是僅僅鎖庫存呢? 這裡建議 分成多個鎖
訪問流程如下:
取到一個分段:這裡可以隨機取,也可以繼續優化(看下文)
直到取到 無鎖 且 庫存足夠的分段為止
問題:秒殺一般只能是一個,這裡考慮的是併發非常高的非秒殺場景
- 如何快速獲取到庫存足的分段
- 購買庫存大於最大分段庫存,但是小於總庫存怎麼實現購買
快速獲取庫存足的分段:
粗略維護各段的庫存總量,返回量夠的分段,再去獲取鎖;獲取鎖失敗,再用庫存夠的段去重試
如果庫存不夠就不去嘗試獲取鎖了
購買庫存大於最大分段庫存:
實現起來就更復雜了,思路是設計一個總庫存的鎖。當獲取不到足夠庫存的分段時,通過總庫存去實現下單
這個方法:會鎖所有分段 更好 的實現方式歡迎大家留言