传统SETNX锁的局限
由于SETNX实现的分布式锁存在锁无法续期导致的并发冲突问题,在实际生产环境中使用较少。当前主流方案是采用Redisson实现的分布式锁。如何用SETNX实现分布式锁
Redisson简介
Redisson(官网)是一个功能强大的Redis Java客户端,提供完善的分布式锁支持。详细实现文档
看门狗机制
Redisson通过引入看门狗机制解决锁超时问题,在Redisson实例关闭前持续延长锁有效期。
默认检查周期为30秒 ,可通过修改Config.lockWatchdogTimeout自定义。
可重入锁实现
依赖配置
XML
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>最新版</version>
</dependency>
客户端配置
java
@Configuration
public class RedissonConfig {
@Bean(destroyMethod="shutdown")
public RedissonClient redisson() throws IOException {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
return Redisson.create(config);
}
}
基础使用
java
@Service
public class LockTestService {
@Autowired
RedissonClient redisson;
public void testLock() {
RLock lock = redisson.getLock("myLock");
try {
lock.lock();
// 临界区代码
} finally {
lock.unlock();
}
}
}
超时设置
java
// 设置30秒超时
lock.lock(30, TimeUnit.SECONDS);
try {
// 临界区代码
} finally {
lock.unlock();
}
高级锁类型
公平锁(锁机制详解:公平锁与非公平锁)
java
RLock fairLock = redisson.getFairLock("anyLock");
fairLock.lock();
联锁
java
RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
lock.lock();
// ...
lock.unlock();
RedLock(红锁)
用于解决Redis单点问题(RedLock:Redis分布式锁解决方案)
读写锁
支持分布式可重入读写锁,允许多读单写:
java
RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 读锁
rwlock.readLock().lock();
// 写锁
rwlock.writeLock().lock();