Redisson

分布式锁Redisson详解,Redisson如何解决不可重入,不可重试,超时释放,主从一致问题的分析解决(包括源码简单分析) 阅读详情

目录

Redisson

Redisson入门

Redisson可重入锁原理(解决不可重入)

Lua实现获取锁​编辑

Lua脚本实现释放锁​编辑

Redisson的深入理解(解决不可重试和超时释放)

总结

解决主从一致性问题

总结​


前文链接:

主要是要学习redis分布锁的原理,其实redis有专门用来处理这些问题的工具

(1条消息) Redis——实现优惠券秒杀_486过于烦躁的博客-优快云博客

(1条消息) 基于Redis的分布式锁实现(秒杀优惠券的优化)_486过于烦躁的博客-优快云博客

Redisson可以解决以下四个问题 

Redisson

之所以引用Redisson是因为前文我们自己实现的锁不满足可重入性(什么是 “可重入”:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁)


Redisson入门

 

实现

    @Resource
    private RedissonClient redissonClient;


     @Transactional
    public Result createVoucherOrder(Long voucherId) {
        //获取用户Id
        UserDTO user = UserHolder.getUser();
        Long userId = user.getId();

        //创建锁对象
        RLock redisLock = redissonClient.getLock("lock:order:" + userId);

        //尝试获取锁
        boolean isLock = redisLock.tryLock();
        //判断
        if(!isLock){
            //获取锁失败,直接返回失败或者重试
            return Result.fail("不允许重复下单");
        }

        try {
            //一人一单
            Integer count = query().eq("user_id", userId).eq("voucher_id", voucherId).count();
            if(count>0){
                //说明用户之前买过了
                return Result.fail("用户已经购买过一次");
            }

            VoucherOrder voucherOrder = new VoucherOrder();

            //扣减库存
            seckillVoucherService.update()
                    .setSql("stock = stock - 1")
                    .eq("voucher_id",voucherId).gt("stock",0)
                    .update();

            //设置订单Id
            long orderId = redisIdWorker.nextId("order");
            voucherOrder.setId(orderId);
            //设置优惠券Id
            voucherOrder.setVoucherId(voucherId);
            //设置用户Id
            voucherOrder.setUserId(userId);

            save(voucherOrder);

            //返回订单Id
            return Result.ok(orderId);
        } finally {
            //释放锁
            redisLock.unlock();
        }
    }

Redisson可重入锁原理(解决不可重入)

通过记录获取锁的数目,可以据此来判断当前是否是在最外围;

因为操作需要具有原子性,所以得采用Lua脚本进行编写

Lua实现获取锁

Lua脚本实现释放锁

可以深入Redisson获取锁与释放锁的流程,可以看到Lua脚本、

获取锁:

释放锁:

Redisson的深入理解(解决不可重试和超时释放)

锁重试:不是一直尝试获取锁,而是等待释放锁的信号量

WatchDog机制:简单来说就是每过一段时间去重置一下有效期;(如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。)

总结


解决主从一致性问题

如下图,如果按照下面方法来操作,获取锁时,如果redis的主节点宕机了,主从还未执行同步,而redis会从slave结点中选取作为主节点,但再次访问时会发现锁已经失效了

初始

 宕机后,选取主节点

multiLock(联锁)

需要同时获取成功才算成功,避免了主机宕机而导致锁失效的问题

总结

springboot整合redisson(一)搭建Redisson环境 一、创建springboot项目 1.通过idea创建springboot项目 2.通过web网站创建springboot项目 创建完之后的项目结构如下: 二、引入redisson依赖 由于我们是springboot整合redisson,所以我们只需引入springboot-redisson-starter就可以了,不过这里需要注意springboot与redisson的版本,因为官方推荐redisson版本与springboot版本配合使用。 将 Redisson 与 Spring Boot 库集成 阅读详情

相关推荐

Redisson 框架详解

Redisson 是一个基于 Redis 的高效 Java 客户端,封装了 Redis 的大部分功能,提供了更为丰富和高效的操作接口,能够帮助开发者更便捷地进行分布式缓存、分布式锁、分布式集合等操作。它不仅支持 Redis 的基本操作,还提供了更多的高级功能,如分布式锁、分布式集合、分布式计数器等,可以大大简化分布式应用的开发。

记得开心一点嘛的博客 2574

Redission分布式锁原理以及不可重入不可重试超时释放等问题的解决和详解

本博客关于分布式锁的常见问题做出了详细的解答

m0_73700925的博客 3462

RedisTemplate和Redisson的区别

一、功能方面:Redisson: java代码解读复制代码上述代码首先创建了 Redisson 的配置对象,将 Redis 服务地址添加进去,接着创建 Redisson 客户端。通过 方法获取一个锁对象,使用 方法加锁,执行完操作后用 方法解锁。这样就实现了分布式锁的操作,而且 Redisson 的锁支持可重入、公平锁等高级特性,能很好地处理分布式环境下的并发问题。支持异步操作,可利用 接口来实现异步调用,提高系统的并发性能。例如,获取锁时可以使用 方法,后续可对 进行相应处理,充分利用异

sc35262的博客 1510

分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

那么什么是Redission呢Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。Redission提供了分布式锁的多种多样的功能针对上述四个问题,Redission提供了自己的解决方案首先Redission支持可重入锁当第一次获取锁失败时,如果已经设置了等待时间的话,则Redisson会等待一段时间后重新尝试获取锁。如果在重试次数。

coderge's 优快云 Blog. 3661

Redisson详解

本文来说下一个强大的redis框架Redisson 文章目录概述 概述 Redisson 是 Java 的 Redis 客户端之一,提供了一些 API 方便操作 Redis。但是 Redisson 这个客户端可有点厉害,该项目已经托管到github,官网如下图所示。 官网:https://github.com/redisson ...

wh柒八九的博客 5464

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7285

Redisson分布式锁解决方案

redisson

zhyaw56zhu的博客 760

手机刷双系统

刷机教程(https://www.geekeyes.cn/forum.php/forum.php?mod=viewthread&tid=492) 解锁教程(http://www.gioov.com/index.php/1386)   解锁教程 cmd下 进入adb目录( 如果环境变量配置了adb 可以直接在cmd 下输入命令) 手机连接电脑,确保usb 调试打开,然后手机连接电脑,...

超宇的博客 1万+

Redis实战——Redisson分布式锁

Redis实战——Redisson分布式锁的使用及原其理

qq_59212867的博客 7497

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 995

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 954

Redisson之RAtomicLong

package bright.redisson; import org.redisson.Redisson; import org.redisson.api.RAtomicLong; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.redisson.config.Sing...

look4liming的专栏 1万+

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

本文介绍了在Ubuntu 24.04上安装和使用GDebi的方法。GDebi是DPKG的轻量级替代品,能够自动解析并安装.deb包的依赖项。文章详细说明了系统更新、安装GDebi的步骤,并演示了通过GUI和CLI两种方式安装.deb包的操作流程。此外,还提供了验证安装和卸载包的方法。GDebi虽然非必需,但为用户提供了处理依赖项的另一种选择,适合需要安装本地Debian包的用户。

山岚的运维笔记 2009

【redisson】redisson分布式锁原理分析

为什么要有分布式锁 分布式锁是基于什么延伸出来的?这个可以在博主首页搜索:超卖, 里面通过超卖例子说明分布式锁和传统锁的区别,本文重点阐述的是redisson的api使用及其源码分析。

孟秋与你的博客 1404

VS2022跨平台开发实战:SSH远程调试Linux程序全攻略

本文详细介绍了如何使用Visual Studio 2022进行跨平台开发,通过SSH协议远程调试部署在Linux服务器上的C/C++程序。文章提供了从环境搭建、连接配置、项目创建到编译调试的完整实战指南,帮助Windows开发者无缝衔接Linux环境,显著提升问题定位与开发效率。

weixin_28826521的博客 431

【软件测试】人工智能(AI)在软件测试领域的应用

AI在软件测试领域的应用使测试过程更加自动化、高效和智能。它可以帮助测试团队减轻负担,更快地识别和修复问题,最终提高软件的质量和可靠性。随着AI技术的不断进步,未来AI在软件测试领域的应用将更加广泛和深入。

weixin_46453070的博客 4387

Redisson之RMap

package bright.redisson; import java.util.concurrent.TimeUnit; import org.redisson.Redisson; import org.redisson.api.RLock; import org.redisson.api.RMap; import org.redisson.api.RedissonClient; imp...

look4liming的专栏 9851

AIGC游戏本地化:用AI实现多语言自动翻译

游戏本地化是游戏全球化战略的关键环节,传统人工翻译方式成本高、周期长。本文旨在探讨如何利用AIGC技术实现高效、准确、低成本的游戏多语言自动翻译解决方案。我们将覆盖从文本翻译到语音合成的完整本地化流程,重点关注AI技术在游戏特定语境下的应用优化。文章首先介绍游戏本地化的核心挑战和AI解决方案,然后深入讲解关键技术原理,接着通过实战项目演示具体实现,最后讨论应用场景和未来趋势。AIGC:人工智能生成内容,指利用AI技术自动生成文本、图像、音频等内容本地化(Localization)

AI 领航者的博客 1339

Redisson之RBucket

package bright.redisson; import org.redisson.Redisson; import org.redisson.api.RBucket; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.redisson.config.SingleSe...

look4liming的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redisson使用场景及原理

Redis是一个开源的高性能键值存储数据库,它提供了多种数据结构来存储数据,如字符串、哈希、列表、集合、有序集合等。Redis将数据存储在内存中,以提供快速的读写访问速度,并且能够通过异步的方式将数据持久化到磁盘上。它支持复制、Lua脚本、事务处理、不同级别的持久化选项以及多种客户端语言的接口。Redis广泛用于缓存、消息队列、短时数据存储和高性能的应用场景中。

不懂的博客 1921

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Boot 整合 Redisson 实现分布式锁详解

摘要:本文介绍了在Spring Boot项目中整合Redisson实现分布式锁的完整方案。首先阐述了分布式锁的基础概念和核心特性(互斥性、安全性、可用性等),对比了主流实现方案。重点讲解了Redisson的优势(可重入锁、自动续约等)及其典型应用场景(库存扣减、任务调度等)。最后详细给出了Spring Boot整合Redisson的具体步骤,包括环境配置、依赖添加、RedissonClient注入和分布式锁的代码实现示例.

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 2138

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 操作系统——死锁
下一篇: redis——实现点赞功能
486过于烦躁
博客等级 码龄6年 17粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值