说明:
基于Redisson快速实现redis分布式锁业务
导入pom文件依赖
使用redisson-spring-boot-starter可以避免配置redisson的bean
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.5.3</version>
</dependency>
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.3</version>
</dependency>
实现源码
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class RedisDistributedLock {
@Autowired
private RedissonClient redissonClient;
/**
* 获取锁
* @param lockKey
* @param waitTime
* @param leaseTime
* @param timeUnit
* @return
*/
public boolean tryLock(String lockKey, long waitTime, long leaseTime,TimeUnit timeUnit) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, timeUnit);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
/**
* 释放锁
* @param lockKey
*/
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
}
调用示例
@Autowired
private RedisDistributedLock redisDistributedLock;
@GetMapping("/test")
public void test(){
//redisson分布式锁,key
String lockKey = "testKey";
// 尝试获取锁,并设置等待时间和超时时间为 6 秒
boolean lockAcquired = redisDistributedLock.tryLock(lockKey, 10,10, TimeUnit.SECONDS);
if (lockAcquired) {
try {
//业务代码
} finally {
// 释放锁
redisDistributedLock.unlock(lockKey);
}
} else {
// 未获取到锁,直接返回错误信息或执行其他逻辑
}
}