1:实现 redis 加锁lock() 类
// 创建 redis 连接
@PostConstruct
private void init() {
Config config = new Config();
config.useSingleServer().setAddress(redisAddress).setPassword(redisPassword);
redisson = Redisson.create(config);
logger.info("Redisson initialized");
}
// 实现 Redis加锁
@Override
public Lock lock(String lockName, long l, TimeUnit unit) {
RLock rLock = redisson.getLock(lockName);
if (l == 0 || unit == null) {
rLock.lock();
logger.info("locked {}", lockName);
} else {
rLock.lock(l, unit);
logger.info("locked {} {} {}", lockName, l, unit);
}
return new LockImpl(logger, rLock);
}
public static class LockImpl implements Lock {
private final Logger logger;
private final RLock rLock;
LockImpl(Logger logger, RLock rLock) {
this.logger = logger;
this.rLock = rLock;
}
2: 使用 Spring 的定时任务
@Scheduled(fixedRate = 60000L)
public void checkAndQueues() throws InternalException {
checkAndUpdateObjects(QUEUE);
}
3:实现类内部加锁 ,解锁;
private void checkAndUpdateObjects(String type) throws InternalException {
加锁时间等于定时任务的间隔时间
Lock lock = redisService.lock(UPDATE_YUNTAI_DATA + type, 1L, TimeUnit.MINUTES);
try {
//这里是业务实现类
} finally {
lock.unlock();
}
}
4: 解锁实现类
public void unlock() {
rLock.unlock();
logger.info("unlocked {}", rLock.getName());
}
}