1. 程式人生 > >如何在springcloud分布式系統中實現分布式鎖?

如何在springcloud分布式系統中實現分布式鎖?

one 動作 分布式系 nil pan prism 培訓 多個 註釋

最近在看分布式鎖的資料,看了 Josial L的《Redis in Action》的分布式鎖的章節。實現思路是利用springcloud結合redis實現分布式鎖。

註意:這篇文章有問題,請看這一篇http://blog.csdn.net/forezp/article/details/70305336

一般來說,對數據進行加鎖時,程序先通過acquire獲取鎖來對數據進行排他訪問,然後對數據進行一些列的操作,最後需要釋放鎖。Redis 本身用 watch命令進行了加鎖,這個鎖是樂觀鎖。使用 watch命令對於頻繁訪問的鍵會引起性能的問題。

  • SETNX命令(SET if Not eXists)

當且僅當 key 不存在,將 key 的值設為 value ,並返回1;若給定的 key 已經存在,則 SETNX 不做任何動作,並返回0。

  • SETEX命令

設置超時時間

  • GET命令

返回 key 所關聯的字符串值,如果 key 不存在那麽返回特殊值 nil 。

  • DEL命令

刪除給定的一個或多個 key ,不存在的 key 會被忽略。

由於redis的setnx命令天生就適合用來實現鎖的功能,這個命令只有在鍵不存在的情況下為鍵設置值。獲取鎖之後,其他程序再設置值就會失敗,即獲取不到鎖。獲取鎖失敗。只需不斷的嘗試獲取鎖,直到成功獲取鎖,雅思培訓一般多少錢或者到設置的超時時間為止。

另外為了防治死鎖,即某個程序獲取鎖之後,程序出錯,沒有釋放,其他程序無法獲取鎖,從而導致整個分布式系統無法獲取鎖而導致一系列問題,甚至導致系統無法正常運行。這時需要給鎖設置一個超時時間,即setex命令,鎖超時後,從而其它程序就可以獲取鎖了。

四、編碼實現

本文采用springboot結合redis 取實現的,所以你需要裝一個redis。

  1. 首先引入創建springboot工程,引入redis 。

2.創建一個鎖類


3.創建分布式鎖的具體方法,思路已經說清楚了,代碼註釋也寫好了,就不講解了。


4.用法:


在使用全局鎖時為了防止死鎖采用 setex命令,這種命令需要根據具體的業務具體設置鎖的超時時間。另外一個就是鎖的粒度性。比如在redis實戰中有個案列,為了實現買賣市場交易的功能,把整個交易市場都鎖住了,導致了性能不足的情況,改進方案只對買賣的商品進行加鎖而不是整個市場。

Josiah.L 《reids in action》

基於Redis實現分布式鎖

如何在springcloud分布式系統中實現分布式鎖?