redis樂觀鎖應用案例實踐

2021-10-09 08:01:38 字數 1066 閱讀 8729

專車系統給司機派單時,需要過濾掉已經派單的司機,防止出現將不同訂單派單給同個司機的情況發生。

以下讀寫操作均是指redis進行讀寫。

目前系統裡以城市維度儲存了每個城市已經處於服務中(已派過訂單)的司機列表,但讀取城市服務中司機列表和寫服務中司機列表時,未進行同步,可能由於高併發,會導致讀的司機列表在執行司機篩選時,服務中司機列表被更改。從而出現同個司機派了多個不同的訂單的情況發生。

因此考慮兩種方式實現

1.使用redis分布式鎖實現悲觀鎖

讀取服務中司機列表和寫入服務中司機列表使用同乙個分布式鎖,此時,需要考慮的是如何盡可能縮小鎖的範圍來降低高併發鎖等待

2.使用redis樂觀鎖

對寫入服務中司機列表時,不作鎖控制。在讀取服務中司機列表時,使用樂觀鎖實現,即使用watch + redis事務進行讀取,若讀取結果為空,表示在讀取期間,資料發生了變化,因此進行重試即可。

測試1) 在a視窗執行以下命令,構造初始資料

2) 在b視窗執行以下命令,使用樂觀鎖+事務方式讀取服務中司機列表

watch driver-list

multi

smembers driver-list

3)在a視窗執行命令新增司機 模擬併發導致發生變化的情況

4) 在b視窗執行exec取事務結果

執行結果為nil表示在事務執行期間,發生了改變,需要進行重試讀取,直到成功。

使用樂觀鎖的方式使系統效能大大提公升,重試只有在併發足夠高時,才會發生。

Redis實現樂觀鎖

悲觀鎖 樂觀鎖 127.0.0.1 6379 set money 100 ok127.0.0.1 6379 set out 0 ok127.0.0.1 6379 watch money 監事 money 物件 ok127.0.0.1 6379 multi 事務正常結束,資料期間沒有發生變動,這個時候...

redis實現樂觀鎖

redis測試監控 正常執行成功!127.0.0.1 6379 set money 100 ok127.0.0.1 6379 set out 0 ok127.0.0.1 6379 watch money 監視money物件 ok127.0.0.1 6379 multi ok127.0.0.1 637...

redis 樂觀鎖(十)

監視 watch 正常業務 單執行緒 127.0.0.1 6379 set money 100 模擬存款100元 ok127.0.0.1 6379 set moneyout 0 模擬花費0元 ok127.0.0.1 6379 watch money 監控存款 ok127.0.0.1 6379 mul...