redis分布式锁一下情况怎么解决

/**
 * @param lockName 锁名称/路径
 * @param waitTime 锁获取等待时间 秒 传空默认10秒
 * @param lockTime 最长加锁时间 秒 传空默认5*60秒
 * @return
 * @describe: 获取一个锁,如果是没有加锁,则会直接获得,如果加锁,会根据等待时间获取锁
 * @author: jiahong.xing/
 * @version: v1.0
 * @date 2018/8/21/021 15:13
 */
public static boolean getLock(String lockName, Integer waitTime, Integer lockTime) {
    if (StringUtils.isEmpty(lockName)) {
        return false;
    }
    if (null == waitTime) {
        waitTime = maxWaitTime;
    }
    if (null == lockTime) {
        lockTime = maxLockTime;
    }
    Long wTime = System.currentTimeMillis() + (waitTime * 1000);
    try {
        while (true) {
            Long inTime = System.currentTimeMillis();
            //如果当前时间大于设置值,则跳出等待
            if (inTime >= wTime) {
                return false;
            }
            boolean isok = RedisUtil.redisTemplate.execute(new RedisCallback<Boolean>() {
                @Override
                public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.setNX(lockName.getBytes(), lockName.getBytes());
                }
            });
            if (isok) {
                //所有加锁成功的,均在线程数据里面增加一条,可以在清理线程数据的时候进行解锁,同时也可以手动解锁
                synchronized (Thread.currentThread()) {
                    SessionRdsLockData.add(lockName);
                }
                RedisUtil.redisTemplate.expire(lockName, lockTime, TimeUnit.SECONDS);
                return true;
            }
            //设置等待时间,不无限请求redis
            Thread.sleep(200);
        }
    } catch (Exception e) {
        e.printStackTrace();
        //获取锁失败
        log.error("获取锁失败:{}", lockName);
        return false;
    }
}

//解锁
public static void unLock(String lockName) {
    if (StringUtils.isEmpty(lockName)) {
        return;
    }
    RedisUtil.remove(lockName);
    SessionRdsLockData.remove(lockName);
}
// 删除对应的value
  public static void remove(final String key) {
    if (exists(key)) {
      redisTemplate.delete(key);
  }

假如A线程获取到锁的线程在指定时间内没有完成,key就会被删除,那么B线程就可以获取到锁,那么A执行unLock方法删除的不就是B线程的key了么,那么多线程情况下就会出现锁不住的情况了把?

你想问的是带时间限制,移除锁的时候想判断是不是已经自动过期。可能其他线程获取到锁,结果被自己删除,导致的幂等性问题吧,用watch解决,我文章里有写,看个思路就行

https://blog.csdn.net/slslslyxz/article/details/105549341?utm_source=app&app_version=4.12.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

可以看下我的一篇博文,里面有关于你的情况处理方式。redis锁和分布式锁的实现:https://blog.csdn.net/qq_40693603/article/details/108963528?utm_source=app&app_version=4.12.0
如有帮助,望点击我回答右上角【采纳】支持一下。

redission中对你说的这种情况作了处理。如果不用框架,基本思路是,A线程没有执行完,会给redis中的key加存活时间,这里使用守护线程的方式来实现监控A线程是否执行结束,并增加锁时间的。A线程执行完毕,主动释放锁;

顺便说一句,如果是lua脚本那么exist和delete可以不用watch因为执行lua的线程仅为1个,所以是原子操作,只需要判断由谁创建