原创

Java-分布式锁-Redisson方式实现分布式锁任务

Redisson方式实现分布式锁任务
RedissonManager.getRedisson(). 还有其他的各种锁、队列等、
多实例的http请求一般不会有锁的问题,但是http触发起的异步任务要注意。
分布式锁一般用于mq或定时任务(xxljob的定时任务没影响)

<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.7.0</version>
</dependency>
package com.safety51.edu.component;

import org.redisson.Redisson;
import org.redisson.config.Config;

//TODO 后期可以改成可用的单例模式
public class RedissonManager {
private static Config config = new Config();
//声明redisso对象
private static Redisson redisson = null;
//实例化redisson
static{
//支持单例和集群
config.useSingleServer().setAddress("10.0.0.136:6379").setPassword("aykj@83752661").setDatabase(1);
//得到redisson对象
redisson = (Redisson) Redisson.create(config);
}
//获取redisson对象的方法
public static Redisson getRedisson(){
return redisson;
}
}
/**
* 使用Redisson处理 封装 分布式锁任务
* lockKey:如果涉及到具体的业务,可以使用具体的业务id,减小粒度。
*/
public static <T> T doDistributedLockTask(String lockKey, long leaseTime, Callable<T> callable) {
//RLock 分布式锁
RLock lock = RedissonManager.getRedisson().getLock(lockKey);
boolean getLock = false;
try {
//long waitTime, long leaseTime, TimeUnit unit
//waitTime 设置>0的值时还是有可能分布式Redis都获取到锁。所有使用0
//waitTime 在这里可以解释为关单任务执行的总时间
if (getLock = lock.tryLock(0, leaseTime, TimeUnit.SECONDS)) {
log.info("------------Redisson获取搭到分布式锁:{},ThreadName:{}", lockKey, Thread.currentThread().getName());
try {
return callable.call();
} catch (Exception e) {
return null;
}
} else {
log.info("------------Redisson没有获取到分布式锁:{},ThreadName:{}", lockKey, Thread.currentThread().getName());
}
} catch (InterruptedException e) {
log.error("Redisson分布式锁获取异常,lockKey:{},", lockKey, e);
} finally {
if (getLock) {
lock.unlock();//已经获取到锁时要释放
log.error("Redisson分布式锁释放锁");
} else {
log.info("等待下一次任务调度");
}
}
return null;
}
public static void main(String[] args) {
Callable<List<String>> dbFunc = () -> {
System.out.println("开始耗时");
Thread.sleep(10000);
System.out.println("结束耗时");
return Lists.newArrayList("1");
};
new Thread(new Runnable() {
@Override
public void run() {
List<String> lockkeyWithPkId = doDistributedLockTask("lockkeyWithPkId", 5, dbFunc);
System.out.println("第一次结果" + JSON.toJSONString(lockkeyWithPkId));
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
List<String> lockkeyWithPkId = doDistributedLockTask("lockkeyWithPkId", 5, dbFunc);
System.out.println("第二次结果" + JSON.toJSONString(lockkeyWithPkId));
}
}).start();

}
后期可以继续改造 closeOrderTaskV3
RedisShardedPoolUtil.setnx(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, String.valueOf(System.currentTimeMillis() + lockTimeout));
实现分布式锁
正文到此结束
本文目录