1. 程式人生 > 實用技巧 >高併發分散式鎖--Redis之Redisson和優化

高併發分散式鎖--Redis之Redisson和優化

拒絕東扯西扯,直接上乾貨

這裡只講原理,如果想了解redisson使用過程的請看看Redisson的官網。

優勢

redisson分散式鎖優勢

  1. 多個redis操作亂指令碼整體提交,保證效能同時,保證整體原子性!
  2. 看門狗自動延續鎖生命週期,防止未處理完鎖過期問題,但是同時造成了阻塞,甚至鎖死
  3. 實現了自旋鎖 :發現鎖後get ttl進行while true對應的時間
  4. 實現了重入鎖 :發現鎖後再看一下clientid是不是自己,如果是+1

原理

redisson分散式鎖使用例子

1

2

3

4

5

RLock lock = redisson.getLock("myLock");

//加鎖

lock.lock();

// 解鎖

lock.unlock();

架構圖

lua指令碼流程圖

lua加鎖指令碼原始碼:

redisson分散式鎖 問題:

自多續期怎麼防止長期阻塞,甚至死鎖,這裡大家思考一下,歡迎留言

優化

高效能分散式鎖優化( 核心思想:分段)

分段鎖:我們常用的是按商品,按商家等進行分段;但是在秒殺的時候,秒的就是一個商品,那麼我們怎麼進行分散式鎖優化呢? 思考一下。。。。

如果我們鎖的是商品庫存,防止超賣問題,那麼我們的思路是,把庫存數量 分段:

1000分成20段,那每段就是50個庫存。

這樣我們的鎖 鎖的是 一個庫存段, 就能對同一個商品的多個庫存段實現分段鎖,實現同一個商品的併發

問題:如果秒殺的鎖並不是僅僅鎖庫存呢? 這裡建議 分成多個鎖

訪問流程如下:

取到一個分段:這裡可以隨機取,也可以繼續優化(看下文)

直到取到 無鎖 且 庫存足夠的分段為止

問題:秒殺一般只能是一個,這裡考慮的是併發非常高的非秒殺場景

  • 如何快速獲取到庫存足的分段
  • 購買庫存大於最大分段庫存,但是小於總庫存怎麼實現購買

快速獲取庫存足的分段:

粗略維護各段的庫存總量,返回量夠的分段,再去獲取鎖;獲取鎖失敗,再用庫存夠的段去重試

如果庫存不夠就不去嘗試獲取鎖了

購買庫存大於最大分段庫存

實現起來就更復雜了,思路是設計一個總庫存的鎖。當獲取不到足夠庫存的分段時,通過總庫存去實現下單

這個方法:會鎖所有分段 更好 的實現方式歡迎大家留言