假設3個線程訪問一個文件資源,對這個文件更新或讀取操做,能夠經過synchronized或lock進行線程同步,解決多線程狀況下併發問題。redis
可是在分佈式架構,都會是多模塊獨立部署不一樣機器,多進程狀況下,怎麼弄?
好比3個系統,訂單,發貨,結算都要去操做同一個文件數據庫
分佈式鎖
1.經過數據庫的方式解決多線程
create table lock(
id
methodname 惟一約束
)
插入一條lock記錄或得鎖,刪除這條lock這條記錄,釋放鎖
1.1 弊端,刪除失敗,其餘的進程都獲取不到這個鎖了
1.2 不是可重入鎖,須要改造架構
2.1 以樹形結構存儲數據
locks下面插入節點,零時有序節點
2.2 優點
有一個watch會監控節點,一個節點失效,會被刪除,會啓用用下一個節點併發
3.1 命令setnx,只會在key不存在的狀況下爲能夠設置值,而且返回0或1,存在返回1,誰先設置這個值,誰先獲取這個鎖分佈式