本文章用于自己学习的操作,如果文章中有错误,麻烦各位留言指正,自己测试单流程是没有问题的

加锁

//调用加锁
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;
 }