拒絕東扯西扯,直接上幹貨
這裡隻講原理,如果想了解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個庫存。
這樣我們的鎖 鎖的是 一個庫存段, 就能對同一個商品的多個庫存段實作分段鎖,實作同一個商品的并發
問題:如果秒殺的鎖并不是僅僅鎖庫存呢? 這裡建議 分成多個鎖
通路流程如下:
取到一個分段:這裡可以随機取,也可以繼續優化(看下文)
直到取到 無鎖 且 庫存足夠 的分段為止
問題:秒殺一般隻能是一個,這裡考慮的是并發非常高的非秒殺場景
- 如何快速擷取到庫存足的分段
- 購買庫存大于最大分段庫存,但是小于總庫存怎麼實作購買
快速擷取庫存足的分段:
粗略維護各段的庫存總量,傳回量夠的分段,再去擷取鎖;擷取鎖失敗,再用庫存夠的段去重試
如果庫存不夠就不去嘗試擷取鎖了
購買庫存大于最大分段庫存:
實作起來就更複雜了,思路是設計一個總庫存的鎖。當擷取不到足夠庫存的分段時,通過總庫存去實作下單
這個方法:會鎖所有分段 更好 的實作方式歡迎大家留言