参考于这篇博客
导入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.8.0</version>
</dependency>
为了获得Redisson
package com.van.mall.common;
import com.van.mall.util.PropertiesUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.config.Config;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author Van
* @date 2020/3/25 - 18:58
*/
@Component
@Slf4j
public class RedissonManager {
private Config config =new Config();
private Redisson redisson=null;
private String redisIp= PropertiesUtil.getPropertity("redis1.ip");
private Integer redisPort=Integer.parseInt(PropertiesUtil.getPropertity("redis1.port")) ;
//构造方法完成后自动执行该方法
@PostConstruct
private void init(){
try {
//Address 是ip:port的形式
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
redisson=(Redisson) Redisson.create(config);
log.info("初始化Redisson完成");
} catch (Exception e) {
log.error("初始化Redisson失败",e);
}
}
public Redisson getRedisson(){
return redisson;
}
}
这里有个坑
一定要在Address里面用redis//开头,不然会报错。
使用Rlock
package com.van.mall.task;
import com.van.mall.common.RedissonManager;
import com.van.mall.util.RedisLockUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
* @author Van
* @date 2020/3/25 - 11:26
*/
@Component
@Slf4j
public class Job {
@Resource
private RedissonManager redissonManager;
// @Scheduled(cron = "*/5 * * * * ?")
public void clean(){
String time=Long.toString(System.currentTimeMillis()+5*1000);
RedisLockUtil.lock("key",time);
log.info("tomcat一执行清理垃圾111111111111111");
RedisLockUtil.unLock("key",time);
}
@Scheduled(cron = "*/5 * * * * ?")
public void clean2(){
RLock lock= redissonManager.getRedisson().getLock("key");
boolean getLock=false;
try {
if (getLock= lock.tryLock(0,5, TimeUnit.SECONDS)) {
log.info("tomcat一执行清理垃圾111111111111111");
}else {
log.info("Redisson没获取到锁:ThreadName:{}",Thread.currentThread().getName());
}
} catch (InterruptedException e) {
log.error("Redisson获取锁异常",e);
}finally {
if (!getLock){
return;
}
lock.unlock();
log.info("Redisson释放锁");
}
}
}
注意:
这里设置为0,要不然会出现两个进程都得到锁