天天看點

高并發分布式鎖--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();

架構圖:

高并發分布式鎖--Redis之Redisson和優化

lua腳本流程圖

高并發分布式鎖--Redis之Redisson和優化

lua加鎖腳本源碼:

高并發分布式鎖--Redis之Redisson和優化

redisson分布式鎖 問題:

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

優化

高性能分布式鎖優化( 核心思想:分段)

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

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

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

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

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

通路流程如下:

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

高并發分布式鎖--Redis之Redisson和優化

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

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

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

快速擷取庫存足的分段:

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

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

購買庫存大于最大分段庫存:

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

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

繼續閱讀