簡單聊聊分佈式鎖的如何實現

1、ZK實現

我們可以通過ZK的臨時順序節點配合watch來實現我們的分佈式鎖

2、redis實現

我們可以通過使用setnx來獲取鎖,如果設置成功,代表當前線程獲取到了鎖(setnx:指定的 key 不存在時,爲 key 設置指定的值,設置成功,返回 1 。 設置失敗,返回 0),但是這種方法也已經是老黃曆了,我們原來是查詢key,然後比較value,然後直接del,但是同樣這些操作無法保證原子性,所以我們現在也可以通過

String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(fullKey), Collections.singletonList(value));
f (Objects.equals(UNLOCK_SUCCESS, result)) {
    flag = true;
}

這種方式來獲取鎖,官方稱爲Lua 腳本

3、數據庫實現

我們可以通過數據庫的唯一性約束來獲取鎖,插入成功才能獲取鎖。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章