使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端,它提供了许多高级功能,包括分布式锁、分布式集合、分布式映射等,简化了分布式系统中的并发控制。
添加依赖
首先,你需要在你的项目中添加Redisson的依赖。以下是Maven配置:
xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.2</version> <!-- 请根据需要选择最新版本 -->
</dependency>
配置RedissonClient
然后,你需要配置RedissonClient来连接Redis服务器:
java
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonConfig {
public RedissonClient getRedissonClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379"); // 配置Redis服务器地址
return Redisson.create(config);
}
}
也可以在配置文件中配置你的redis连接,具体可以自行百度
创建RedissonTool工具类
java
@Component
public class RedissonTool {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private RedissonClient redissonClient;
/**
* 获得锁的对象
*
* @param lockKey 锁的key值
* @return 锁对象
*/
public RLock getLockByKey(String lockKey) {
RLock lock = null;
try {
lock = redissonClient.getLock(lockKey);
} catch (Exception e) {
logger.error("[RedissonTool.getLockByKey] getLock is exception}", e);
}
return lock;
}
/**
* 获取锁是否成功
*
* @param lock 锁对象
* @return true=成功,false=失败
*/
public Boolean isTryLock(RLock lock) {
//默认是通过
boolean result = true;
//获得锁的对象
if (lock != null) {
try {
result = lock.tryLock();
} catch (Exception e) {
this.logger.error("[RedissonTool.getLockByKey] lock.tryLock is excepiton}", e);
}
}
return result;
}
}
使用分布式锁
- 使用tryLock()
java
RLock lock = redissonClient.getLock("myLock");
boolean isLocked = false;
try {
isLocked = lock.tryLock(lock);
if (isLocked) {
// 执行临界区代码
} else {
// 未获取到锁的处理逻辑
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (isLocked) {
lock.unlock(); // 解锁
}
}
- 直接使用 lock.lock()
java
RLock lock = redissonTool.getLockByKey(CacheConstants.ORDER_RESULT_DEAL + outTradeNo);
lock.lock(); // 直接获取锁,阻塞式
// 执行业务逻辑
lock.unlock(); // 解锁