Lua脚本解决Redis 分布式锁

Redis分布式锁

  • 由于判断锁和释放锁是两个步骤,在判断一致后如果线程阻塞导致锁超时释放。之后阻塞结束,当前线程继续执行释放了其它线程的锁。锁设计失败
  • 解决方法:通过lua封装比较和释放锁两个步骤:要么同时成功,要么同时失败
  • 我的疑问?为什么不对判断和释放锁两个步骤添加事务
  • 由于这两个步骤不像数据库操作一样支持回滚,所以无法通过事务约束

 @Override
    public void unlock() {
      // 调用lua脚本
        stringRedisTemplate.execute(
                UNLOCK_SCRIPT,
                Collections.singletonList(KEY_PREFIX + name),
                ID_PREFIX + Thread.currentThread().getId());
    }

    @Override
    public void unlock() {
        // 获取线程表示
        String threadId = ID_PREFIX + Thread.currentThread().getId();
        // 获取锁中标识
        String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + name);
        // 判断标识是否一致
        if (threadId.equals(id)) {
            // 释放锁
            stringRedisTemplate.delete(KEY_PREFIX + name);
        }
    }
posted @ 2024-07-29 10:51  Biang-Biang  阅读(104)  评论(0)    收藏  举报