redis实现分布式锁导致的问题

解决缓存击穿的问题(加锁)

1.虽然spring组件都是单例的,但是到了多个机器部署服务的情况下这种单机锁就不可行了

使用分布式锁

1.有可能占用锁的那个线程因为宕机没有删除锁,导致整个系统死锁,所以要设置锁的过期时间

2.但是在获取锁和设置过期时间的过程中,客户端宕机导致过期时间没有设置同样会出现问题,所以就要保证获取锁和设置过期时间需要为原子操作,所以可以使用set扩展命令或者lua脚本,保证原子性

3.释放别人的锁,有两种情况会导致:

(1)访问redis发现自己的已经到了过期时间,但是在redis发送结果到客户端途中,这个锁被其他线程获取,之后再进行释放就释放了别人已经获得的锁

(2)自己的业务流程执行时间过长,锁到期自动释放,其他线程进行锁的获取,在自己的业务流程执行完之后还回去释放锁,结果就释放了别人已经获得的锁

所以可以采用一个唯一id来确保释放的是自己的锁

4.业务没有执行完就释放锁,所以需要加长锁的过期时间,但是我们无法对时间做出合理的估计,所以使用redisson可以解决,里面集成了看门狗操作完成自动续期操作

Redisson

默认过期时间30S 2)锁自动续期+30S,业务超长情况下(看门狗) 3)如果线程宕机,看门狗不会自动续期,锁会自动过期 4)unlock使用lua脚本释放锁,不会出现误删锁

锁的时效性

结果放入缓存的操作,应该放在同步代码块内,否则会造成重复查询DB的情况

Original: https://www.cnblogs.com/zz01/p/16687314.html
Author: 山野村夫01
Title: redis实现分布式锁导致的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621422/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mysql 触发器

    Mysql触发器 1、1 触发器定义 ​ 触发器是由事件来触发某个操作, 事件包括 insert update delete事件, 优势: 保证数据完整性。 触发器可以帮助记录操作…

    数据库 2023年6月11日
    088
  • Nginx实现服务器端集群搭建

    Nginx实现服务器端集群搭建 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解,我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的,但是在…

    数据库 2023年6月6日
    081
  • Java面试题(三)–虚拟机

    1 内存结构 1、简述一下JVM的内存结构?(高频) JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图所示,可以分为两大…

    数据库 2023年6月16日
    077
  • MySQL函数学习(四)—–聚合函数

    注:笔记旨在记录 四、MySQL 聚合函数 \ 函 数 名 称 作 用 完 成 1 MAX 求最大值 勾 2 MIN 求最小值 勾 3 COUNT 求数量 勾 4 BIT_COUN…

    数据库 2023年5月24日
    0100
  • 设计模式之适配器模式

    一、适配器模式:把两个不匹配的接口通过一个中间层变成可匹配的,这个中间层叫适配器,比如两脚插头+三脚插座无法进行匹配,可使用一个转接头来结合使用,这个转接头就是适配器。 二、实现思…

    数据库 2023年6月14日
    074
  • 奶奶常说,黑白照片看的不清晰,还好我会Python,分分钟给她变成彩色的~

    咳咳~ 其实是奶奶常说,艾欧尼亚昂扬不灭,正义将指引着我们! 好吧,并不是奶奶说,只是最近回家发现一些黑白老照片,看着不够清晰,然后实验了一波用Python把老照片变成彩色的。 代…

    数据库 2023年6月14日
    096
  • 牛客SQL刷题第三趴——SQL必知必会

    【问题】编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现 toy 和 carrots …

    数据库 2023年6月16日
    099
  • 2022-08-19 PreparedStatement

    PreparedStatement接口是 Statement的子接口,它表示一条预编译过的SQL语句 什么是SQL注入 SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,…

    数据库 2023年5月24日
    096
  • Java面试题(九)–Spring MVC

    1、Spring MVC中的拦截器和Servlet中的filter有什么区别? 过滤器:依赖于servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤 拦截器:依赖于w…

    数据库 2023年6月16日
    075
  • Qt 的事件监听和事件过滤

    Qt 产品级的开发项目中经常会用到一些自定义控件,从而达到一些可定制化的效果,这时候往往需要重写它的监听事件,满足产品的需求。这里用一个简单的例子记录一下思路: 新建一个DiyLa…

    数据库 2023年6月16日
    090
  • Java线程状态(生命周期)–一篇入魂

    1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态。 线程可以有如下6 种状态: New (新创建):未启动的线程; Runnable (可运行):可运行的线程,需要…

    数据库 2023年6月6日
    0104
  • MySQL–创建计算字段

    存储在数据库表中的数据一般不是应用程序所需要的格式。下面举几个例子。  如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中。  城市、州和邮政…

    数据库 2023年6月16日
    091
  • mysql拆分字符串做条件查询

    mysql拆分字符串作为查询条件 有个群友问一个问题 这表的ancestors列存放的是所有的祖先节点,以 ,分隔 例如我查询dept_id为103的所有祖先节点,现在我只有一个d…

    数据库 2023年6月16日
    067
  • centos8安装mysql

    前言 最近在centos8系统下部署django项目时,要用到mysql数据库,在安装中遇到了点坑,之后参考了一位博主的文章,也是顺利的安装配置成功,博主原文连接: ((20条消息…

    数据库 2023年5月24日
    086
  • MySQL 官方出品,比 mydumper 更快的多线程逻辑备份工具-MySQL Shell Dump & Load

    mysqldump 和 mydumper 是我们常用的两个逻辑备份工具。 无论是 mysqldump 还是 mydumper 都是将备份数据通过 INSERT 的方式写入到备份文件…

    数据库 2023年5月24日
    083
  • JavaWeb连接MySQL数据库

    JavaWeb连接MySQL数据库 JavaWeb连接MySQL数据库的方式有很多,首先我们讲解JDBC的配置方法 一、JDBC的配置方法 1、什么是JDBC 什么是JDBC嘞?J…

    数据库 2023年5月24日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球