最近開發的場景有分布式任務,任務是建立某些資源,只有建立成功了,某些資源才可使用。此時要考慮用分布式鎖,有以下幾種思路
1.通過資料庫,其實是建立一張表,字段類似於,id,key,values,status(和values欄位二選一),createtime。要鎖定某個物件時,以其唯一性的字段(例如id)作為key,資料作為values存入,此時為鎖定狀態;解鎖時,將values致為null。寫個定時任務,查詢createtime,使超時的鎖失效。但是這個情況,需要資料庫具有強一致性,不能多人同時對乙個資料做操作,而且資料庫和**程式是兩套程式,不好維護
2.通過程式(**)
1> 建立乙個map,讓map充當表的作用,在這個專案存活期間,一直有效,當操作某個物件時,將這個物件,以kv形式放入map,而且要保證map是唯一乙個,此時就用到了單例模式;而且map的set和put是只能同時一人操作的,故要加鎖。**如下:
var instancemap map[string]inte***ce{}
func getinstancemap()map[string]inte***ce{})
}return instancemap
}func lockinstancemap(k string,v inte***ce{})errorelse
}func unlockinstancemap(k string)
func getkeyinstancemap(k string)inte***ce{}
2> 上面這種方法還是有問題,當程式包部署兩個地方,a程式的動作之後加鎖,b接收到了a完成的動作,沒辦法解開map的鎖,那麼基於客戶端的快取做鎖,此方法後續再講。
3.redis或zookeeper做分布式鎖。本人的其他部落格有詳細介紹
在開發中用到的redis分布式鎖
在修改產品的時候,針對同乙個產品多次進行修改的時候,出現了修改不符合預期的情況,後來發現是因為針對同乙個產品在同一時刻同時呼叫幾次修改的介面,會導致出現異常的情況。為了防止這種情況出現,首先想到了同步,但是修改任務是在多台伺服器上部署,並且分片只是按照id分片。因此如果只是單純的加鎖也還是會出現在不...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式專題 分布式鎖
在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步 塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以j...