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、數據庫實現
我們可以通過數據庫的唯一性約束來獲取鎖,插入成功才能獲取鎖。