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、数据库实现
我们可以通过数据库的唯一性约束来获取锁,插入成功才能获取锁。