栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

分布式锁-Redis实现方案&Redisson源码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分布式锁-Redis实现方案&Redisson源码分析

一、原生SetNx实现逻辑问题分析 1.1 示例代码
        String value = UUID.randomUUID().toString();
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(key, value, milliseconds, TimeUnit.MILLISECONDS);
        try {
            if (aBoolean) {
                System.out.println("处理业务逻辑");
            }
        } finally {
            String cacheValue = redisTemplate.opsForValue().get(key);
            if (Objects.equals(value, cacheValue)) {
                redisTemplate.delete(key);
            }
        }
1.2 示例代码分析
  1. 锁无法续期,最终不能保证排它性
  2. 释放锁非原子操作
  3. 不支持重入
二、Redisson锁实现


1、Lua脚本,key是我们传递过来的加锁的key,ARGV[2]是锁的名称线程ID,ARGV[1]锁的过期时间,默认30s
第一个if是加锁成功的逻辑,第二个if是锁的重入逻辑,最后是加锁失败,并返回锁的剩余时间。

2、加锁成功后构造锁续命数据,对象中是个Map

1、获取锁失败失败的线程,订阅释放锁的通道,加入等待队列中,等待被唤醒

释放锁逻辑

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号