Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁

    浏览器把100w请求由网关随机往下传,在集群情况下,每台服务都放行10w请求过来,这时候每台服务都用的是本地锁是跨JVM的, 列如这些服务都没有49企业,此时有几个服务进行回原了打击在DB上面,那后期把这个服务部署了N台,N台用的都是自己的锁,是锁不住的

分布式锁第一阶段

让微服务都去公共位置去,列如Redis去抢占坑位利用setnx命令,如果是1了,操作成功,是1变成0操作失败,

问题:如下图如果抢到锁了 业务在执行期间机器宕机或停电了,后面解锁业务没有执行到,锁一直在,其他服务如果还想获取到这个锁,就会导致永远获取不到这个锁了,所以得引入过期时间

 分布式锁第二阶段

引入过期时间后即使业务爆炸等10s以后再自行删除

问题:如果执行过期时间的时候停电了,导致这行代码没有设置上,所以加锁和过期时间必须是一起的保证原子性操作。

 分布式第三阶段

为了保证原子性可以使用set key value EX “过期时间” NX,加锁+过期时间 用原子操作没问题了

极端情况:
假设锁10s过期,

  1. A运行9.5s业务结束开始删锁,给redis发请求。速度慢
  2. redis第10s锁过期自动删除,然后B抢到了锁,这个锁是B,B已经开始执行业务了
  3. B执行业务的时候,A删锁命令顺着网线爬到redis。直接调用del lock,删除了这个key。导致删除了B的锁的错误。B锁没有,其他C可能又进来。两个人都在执行业务,没锁住 

分布式锁第四阶段

为了避免解别人的锁,利用UUID作为每个线程自己锁的唯一值

问题解除锁的时候可能会解到别人的锁

分布式锁终极阶段

利用Lua脚本删除锁

使用redisson

特点:
    1,锁名称相同就认为是同一把锁
    2,自动续期 默认是30S  每10S 会续期30S  
        只要锁没有指定释放时间,每隔lockWatchdogTimeout/3 就会给锁续期,续满看门狗时间30S  也就是每10S会进行喂狗操作
private long lockWatchdogTimeout = 30 * 1000;
3,加锁操作 + 过期时间操作 能保证原子性,获取锁 + 判断锁 + 删除锁 也能保证原子性
4,redisson底层的所有操作都依赖于lua脚本

看门狗如何自动续期 

Redisson看门狗机制, 只要客户端加锁成功,就会启动一个 Watch Dog。

redisson底层有个 看门狗时间 = lockWatchdogTimeout ; 30s;每10s进行一次 喂狗

1,scheduleExpirationRenewal(threadId); 定时重新设置过期时间

  • 底层使用 Timeout;定时任务。每隔internalLockLeaseTime / 3执行重新设置超时时间的任务;

    • 超时时间设置好以后,递归调用自己,又启动一个定时任务

    • 定时任务是在 internalLockLeaseTime[30000] / 3 毫秒以后执行

    • 每10s执行一次任务。

2,如果服务宕机了,Watch Dog 机制线程也就没有了,此时就不会延长 key 的过期时间,到了 30s 之后就会自动过期了,其他线程就可以获取到锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438392.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00172】基于SSM的老年人健康管理系统(论文+PPT)

基于SSM的老年人健康管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的老年人健康管理系统 本系统分为前台、管理员以及用户3个功能模块。 前台:当游客打开系统的网址后,首先看到的就是首…

java基础 -10 Set之ConcurrentSkipListSet、EnumSet

ConcurrentSkipListSet ConcurrentSkipListSet是java中的集合类,是在多线程的环境中使用的,实现Set接口,它基于跳表(skip List)的数据结构。跳表是一种基于并行排序的数据结构,允许快速的出入,删除和查找操作&#xf…

selenium-Web界面搜索功能测试

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨 测试环境准备: 1、安装Python 2、安装Ch…

浅谈Cookie跨域获取

《浅谈Cookie跨域获取》首发牧马人博客转发请加此提示 浅谈Cookie跨域获取 背景 最近在接入一个第三方的单点登录平台,使用的Oauth2对接的,本来是没啥问题,奈何退出环节他是使用Cookie进行退出的,这时就涉及到了一个跨域问题。看下…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是: 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

RabbitMQ-如何保证消息不丢失

RabbitMQ常用于 异步发送,mysql,redis,es之间的数据同步 ,分布式事务,削峰填谷等..... 在微服务中,rabbitmq是我们经常用到的消息中间件。它能够异步的在各个业务之中进行消息的接受和发送,那么…

Python根据Excel表进行文件重命名

一、问题背景 在日常办公过程中,批量重命名是经常使用的操作。之前我们已经进行了初步探索,主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…

Thymeleaf基础教程

系列文章目录 文章目录 系列文章目录一、Thymeleaf 语法规则二、Thymeleaf 语法分为以下 2 类标准表达式语法th 属性2.1 基础语法2.1.1 变量表达式 ${}2.1.2 选择变量表达式 *{}2.1.3 链接表达式 {} 2.1.4 消息表达式 三、常用的 th 标签四、迭代循环 一、Thymeleaf 语法规则 …

C++类和对象引入以及类的介绍使用

文章目录 一、面向过程和面向对象的初步认识二、类的引入2.2 类的引入 三、类的访问限定符及封装3.3 访问限定符3.4 【面试题】C中struct和class的区别3.5 类的两种定义方式 四、封装【面试题】面向对象的三大特性 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储…

网络通信实现

【 一 】网络通信实现 【 1 】实现网络通信的四要素 本机的ip地址 子网掩码 网关的IP地址 DNS的IP地址( 域名系统) DNS服务器是指提供域名解析服务的服务器。它负责将域名转换为相应的IP地址,以便计算机可以通过IP地址与其他设备进行通信。 通过使用DNS服务器…

ESP8266采用AT指令连接华为云服务器方法(MQTT固件)

一、前言 本篇文章主要介绍3个内容: (1)ESP8266-WIFI模块常用的AI指令功能介绍 (2)ESP8266烧写MQTT固件连接华为云IOT服务器。 (3)介绍华为云IOT服务器的配置过程。 ESP8266是一款功能强大…

LVGL部件

一.标签部件 1.如何创建标签部件以及设置文本 ![2024-01-28T09:54:08.png][3] void my_lvgl(void) {lv_obj_t *lablelv_label_create(lv_scr_act()); //创建一个标签lv_label_set_text(lable,"hello"); //普通更改文字lv_label_set_text_fmt(lab…