3 回答

TA貢獻1802條經(jīng)驗 獲得超4個贊
看你要實現(xiàn)什么樣的鎖,或者基于什么樣的使用場景,比如說排它鎖
,redis
就實現(xiàn)不了,排它鎖
在獲取不到鎖的情況下會阻塞進入等待隊列。在其他進程釋放鎖時會通知該進程再去獲取鎖,redis
不提供這種基于key
的通知機制,所以他實現(xiàn)不了排它鎖
。不過分布式排它鎖
,可以由Zookeeper
實現(xiàn)。
另外一種分布式鎖的實現(xiàn)方式是通過樂觀鎖和自旋的實現(xiàn)方式,就是你說的那種方式,不過一般會設置超時時間,也就是redis
設置key
的ttl
。這樣不至于進程一直等待下去。這種鎖適應于鎖內操作時間比較短,鎖競爭不是那么激烈的情況。
你說的那種100個進程搶鎖的情況,競爭這么激烈,還是用排它鎖比較好。

TA貢獻1797條經(jīng)驗 獲得超6個贊
這個原因充分說明了要項目驅動學習。
只有你知道具體的項目的場景,才可以決定自己這個鎖怎么處理。
比如,你如果搶不到資源就必須等待,而且是同步請求,那么必須等待。
比如,你如果可以接受若一致,就可以考慮等待多久鎖,然后放棄,記錄日志或者其他補償機制。
當然這個就類似于 ReentrantLock 里面的 tryLock 和 tryLock(long timeout, TimeUnit unit) 的區(qū)別

TA貢獻1801條經(jīng)驗 獲得超8個贊
需要帶鎖的操作一遍不會這樣的邏輯。。。
比如緩存數(shù)據(jù)的更新。
1.取到鎖的人去查數(shù)據(jù)庫并更新數(shù)據(jù)
2.未取到鎖的要么直接返回空,要么就是要設置二級緩存,把二級緩存的數(shù)據(jù)返回。。
大家都一直要拿到同一個鎖,應該沒有這種操作吧?
具體還是要有業(yè)務邏輯來進行代碼編寫,不然沒有意義
添加回答
舉報