maven 依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-avro</artifactId>
<version>2.9.0</version>
</dependency>
RedissonManager 分装初始化
@Component
@Slf4j
public class RedissonManager {
private Config config = new Config();
private Redisson redisson = null;
public Redisson getRedisson() {
return redisson;
}
// 从配置文件里获取 redis 的 ip 和端口
private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip");
private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));
@PostConstruct
private void init() {
try {
config.useSingleServer().setAddress(new StringBuilder().append(redis1Ip).append(":").append(redis1Port).toString());
redisson = (Redisson) Redisson.create(config);
log.info("初始化Redisson 结束");
} catch (Exception e) {
log.error("Redisson init error",e);
}
}
}
redisson 分布式锁 业务编码
@Autowired
private RedissonManager redissonManager; // 注入 RedissonManager
@Scheduled(cron = "0 */1 * * * ?")// 每 1 分钟执行一次 (1 分钟的整数倍)
public void closeOrderTaskV4() {
RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
boolean getLock = false;
try {
/**
* tryLock 里的第一个参数 waitTime 要设置成为0,否则或导致两个线程都会获取到锁,这是不行的,
* 设置为 0 让各个线程去竞争获取锁,不要等待
*/
if (getLock = lock.tryLock(0, 50, TimeUnit.SECONDS)) {
log.info("Redisson 获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName());
/**
* 竞争获取到了锁,执行相关的业务逻辑,这里是 定时器关闭超时订单
*/
int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.out", "2"));
iOrderService.closeOrder(hour);
} else {
log.info("没有获取到分布式锁:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
}
} catch (InterruptedException e) {
log.error("Redisson 获取分布式锁异常",e);
}finally {
if (!getLock) {
return;
}
lock.unlock();
log.info("Redisson 分布式释放锁");
}
}
// 省略其他代码