java 17
若依:3.8.9
maven仓库链接:https://central.sonatype.com/artifact/org.redisson/redisson
一、引入maven依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.45.1</version>
</dependency>
二.添加工具类RedisLock.java
package com.ruoyi.common.core.redis;
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;
/**
* redis锁工具类
*
* @author ruoyi
*/
@Component
public class RedisLock
{
@Autowired
private RedissonClient redissonClient;
/**
* 获取锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock getRLock(String lockKey)
{
return redissonClient.getLock(lockKey);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock lock(String lockKey)
{
RLock lock = getRLock(lockKey);
lock.lock();
return lock;
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @return true=成功;false=失败
*/
public Boolean tryLock(String lockKey, long leaseTime)
{
return tryLock(lockKey, 0, leaseTime, TimeUnit.SECONDS);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long leaseTime, TimeUnit unit)
{
return tryLock(lockKey, 0, leaseTime, unit);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit)
{
RLock rLock = getRLock(lockKey);
boolean tryLock = false;
try
{
tryLock = rLock.tryLock(waitTime, leaseTime, unit);
}
catch (InterruptedException e)
{
return false;
}
return tryLock;
}
/**
* 释放锁
*
* @param lockKey 锁实例key
*/
public void unlock(String lockKey)
{
RLock lock = getRLock(lockKey);
lock.unlock();
}
/**
* 释放锁
*
* @param lock 锁信息
*/
public void unlock(RLock lock)
{
lock.unlock();
}
}
3、新增配置RedissonConfig.java
package com.aspire.datasynchron.framework.config;
import com.aspire.datasynchron.common.utils.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* redisson配置
*
* @author ruoyi
*/
@Configuration
public class RedissonConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password:}") // 允许密码为空
private String password;
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(RedissonClient.class)
public RedissonClient redissonClient() {
Config config = new Config();
String address = "redis://" + host + ":" + port;
SingleServerConfig serverConfig = config.useSingleServer()
.setAddress(address)
.setDatabase(1);
if (StringUtils.hasText(password)) {
serverConfig.setPassword(password);
}
return Redisson.create(config);
}
}
4、示例
@Slf4j
@Component("statisticalDataTask")
public class StatisticalDataTask {
@Autowired
private IStatisticalDataService statisticalDataService;
// 引入RedisLock
@Autowired
private RedisLock redisLock;
/*
* 轮询所有上游接口获取数据并保存到数据库中并加密
*/
public void rollPoling() {
String lockKey = "statisticalDataLock:" + "rollPoling";
RLock rLock = redisLock.getRLock(lockKey);
try {
// 尝试获取锁,等待时间为 3 秒,锁超时时间为 100 秒
if (rLock.tryLock(3, 100, TimeUnit.SECONDS)) {
try {
log.info("轮询所有上游接口定时任务开始执行");
statisticalDataService.rollPoling();
log.info("轮询所有上游接口定时任务执行结束");
} finally {
// 确保在完成后释放锁
if (rLock.isHeldByCurrentThread()) {
rLock.unlock();
}
}
} else {
log.error("轮询所有上游接口定时任务, 获取锁失败");
}
} catch (Exception e) {
log.error("轮询所有上游接口定时任务执行异常:{}", e);
}
}
}
参考文献:https://blog.csdn.net/weixin_56404155/article/details/145880379
评论0
暂时没有评论