本文章用于自己学习的操作,如果文章中有错误,麻烦各位留言指正,自己测试单流程是没有问题的
加锁
//调用加锁
boolean lock = redisService.getLock(resourceInfoId.toString(), String.valueOf(Thread.currentThread().getId()));
if (lock == false) {
return new FebsResponse().fail().message("当前资源正在审核中,请勿重复提交!");
}
//调用解锁 ps:无论程序运行是否成功,都要释放锁,否则可能导致陷入死锁,如果是try方式,将解锁调用放在finally里面
try{
}finally{
redisService.releaseLock(resourceInfoId.toString(), String.valueOf(Thread.currentThread().getId()));
}
//静态参数
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
private static final Long RELEASE_SUCCESS = 1L;
//加锁方法
@Override
public boolean getLock(String key,String requestId) {
String result = jedisPool.getResource().set(key, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
//解锁方法
@Override
public boolean releaseLock(String key,String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedisPool.getResource().eval(script, Collections.singletonList(key), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
ps:上述代码不够完善,上线后发现,程序报错异常信息:Could not get a resource from the pool,然后修改一下,示例一下加锁方法,解锁方法同样要释放连接池
public boolean getLock(String key,String requestId) {
Jedis jedis = null;
try{
jedis = jedisPool.getResource();
String result = jedis.set(key, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
}finally {
if(null != jedis){
jedis.close();
}
}
return false;
}