分布式锁实现
Redis 分布式锁
public class RedisDistributedLock {
private final StringRedisTemplate redisTemplate;
private static final String LOCK_PREFIX = "lock:";
private static final long DEFAULT_EXPIRE = 30000;
public boolean tryLock(String key, long expire) {
String lockKey = LOCK_PREFIX + key;
Boolean result = redisTemplate.opsForValue()
.setIfAbsent(lockKey, UUID.randomUUID().toString(), expire, TimeUnit.MILLISECONDS);
return Boolean.TRUE.equals(result);
}
public void unlock(String key) {
String lockKey = LOCK_PREFIX + key;
redisTemplate.delete(lockKey);
}
}
Redisson 分布式锁(推荐)
@Service
public class DistributedLockService {
@Autowired
private RedissonClient redissonClient;
public boolean tryLock(String lockKey, long waitTime, long leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
Zookeeper 分布式锁
// Curator 框架实现
public class ZkDistributedLock {
private final CuratorFramework client;
private static final String LOCK_PATH = "/locks/";
public void acquire(String lockName) throws Exception {
String lockPath = LOCK_PATH + lockName;
InterProcessMutex mutex = new InterProcessMutex(client, lockPath);
mutex.acquire();
}
public void release(String lockName) throws Exception {
String lockPath = LOCK_PATH + lockName;
InterProcessMutex mutex = new InterProcessMutex(client, lockPath);
mutex.release();
}
}
Redis vs Zookeeper 分布式锁对比
| 特性 | Redis | Zookeeper |
|---|
| 实现方式 | SETNX + expire | 临时顺序节点 |
| 性能 | 高(纯内存) | 中(需写磁盘) |
| 可靠性 | 需处理锁续期 | CP 强一致性 |
| 公平性 | 非公平(默认) | 公平(顺序节点) |
| 复杂度 | 低 | 中 |
| 适用场景 | 高并发、允许短暂不一致 | 强一致性要求 |
参考链接