大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
在Redis中实现分布式锁通常有两种方式:使用SETNX命令和使用Lua脚本。以下是使用Lua脚本的一个示例:
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private Jedis jedis;
private String lockKey; // 锁的键值
private int expireTime; // 锁的超时时间
public RedisDistributedLock(Jedis jedis, String lockKey, int expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.expireTime = expireTime;
}
public boolean lock() {
long end = System.currentTimeMillis() + expireTime;
String identifier = UUID.randomUUID().toString(); // 生成唯一标识
String expireTimeStr = String.valueOf(expireTime);
while (System.currentTimeMillis() < end) {
if (jedis.setnx(lockKey, identifier) == 1) {
jedis.expire(lockKey, expireTimeStr); // 设置锁的过期时间
return true;
}
// 尝试获取锁失败,休眠一段时间后重试
try {
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return false;
}
public boolean unlock() {
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(lockKey), Collections.singletonList(identifier));
return result.equals(1L);
}
}
这个示例中,lock
方法使用Lua脚本来安全地设置键值和过期时间,以防止因为客户端宕机或网络问题导致的锁无法释放。unlock
方法使用另一个Lua脚本来安全地检查标识符并删除键,只有当标识符匹配时才释放锁。这样可以防止由于锁被不正确的客户端释放而引起的数据不一致问题。
评论已关闭