自己设置Redis分布式锁可能出现的问题及解决方案

解决:sexnx需要加超时时间,值与超时时间一起设置,保证原子性,如果分开设置,设置值后服务挂了,仍然会死锁。

如果超时时间设置的是30s,线程1由于某种原因30s还没有执行完,这时已经到达锁失效时间,锁释放后,线程2拿到锁也可以执行了,这时线程1执行完了,手动释放了锁,但是此刻释放的锁并不是当时它拿到的,而是线程2的,线程1释放了线程2的锁,这时线程3也可以拿到锁了,以此类推,线程释放了不是自己当初拿到的锁,造成了锁失效的现象
解决:给每个线程加锁的时候设置一个唯一ID,例如:sexnx(lockkey,UUID,expiretime)释放锁的时候判断当前锁中的值是否是当前线程的

问题2解决了锁失效的问题(释放了不是自己加的锁),但是有一种情况,线程1还没有执行完减库存,锁超时自动失效,线程2拿到锁,这样有可能有2个线程同时执行减库存,那就有问题了
解决:锁续命,每过几秒钟(大概设置时间的1/3),查询当前设置的锁是否还存在,存在的话,再重新设置一下,例如:设置30s,到10s锁还存在,则再重新设置为30s

watch dog机制,实现了锁的可续期。

但是还有一个问题Redission没有解决,redis主从架构的情况下,由于数据从master同步到slave需要一定的时间,还有没有同步成功master挂了,这时重新选举了slave作为新的master,但是当前线程加的锁并没有同步过来,这时其它线程又可以从新的master获取锁了,造成线程1和线程2同时减库存的可能

如果要避免这种情况,只能用zookeeper了,zookeeper要求主从强一致性,但是zookeeper写性能不如redission

Original: https://www.cnblogs.com/xxhxs-21/p/16539261.html
Author: 花祈梦
Title: 自己设置Redis分布式锁可能出现的问题及解决方案

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

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

(0)

大家都在看

  • Java多线程超级详解(只看这篇就够了)

    多线程能够提升程序性能,也属于高薪必能核心技术栈,本篇会全面详解Java多线程。@mikechen 主要包含如下几点: 基本概念 很多人都对其中的一些概念不够明确,如同步、并发等等…

    Java 2023年6月15日
    0100
  • Docker 命令自动补全?要的

    前言 不知道这个小伙伴有多久没用过 Docker 了, 突然对我说 Docker 命令怎么发生变化了 docker run … #变成了 docker container ru…

    Java 2023年6月5日
    099
  • Java基础–异常处理

    Java中的错误会以对象方式呈现为 java.lang.Throwable的个种子类示例。通过捕获包装错误的对象,可以针对错误做一些对应的处理。本文主要记录其中比较容易记错的点。 …

    Java 2023年6月5日
    084
  • Java面试题

    包含的模块 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring B…

    Java 2023年5月29日
    068
  • Sonar 扫描之SonarScanner介绍

    SonarScanner用于在构建系统没有指定scanner时使用。 项目配置 在你的项目根目录中创建一个名为 sonar-project.properties的配置文件 &amp…

    Java 2023年6月16日
    092
  • Nginx + FastCgi + Spawn-fcgi + c 的架构

    参考: nginx+c/c++ fastcgi:http://www.yis.me/web/2011/11/01/66.htm cgi探索之路:http://github.tian…

    Java 2023年5月30日
    078
  • JAVA入门基础_从零开始的培训_JAVAWEB

    1、前端知识的学习 HTML(Hyper Text Markup Language)超文本标记语言 常见标签 文字、段落标签 图片标签 列表标签 表单 a标签 Tomcat新建项目…

    Java 2023年6月9日
    0106
  • 【踩坑日记】记一次静态导入引起Lombok失效,导致编译失败的惨案

    时间: 某个普通的周一 天气: 晴,万里无云 内容: 开开心心写完需求,提交代码,打包部署。 [INFO] ————————————…

    Java 2023年6月5日
    097
  • Git下载与安装

    一、Git下载 官网下载地址:Git (git-scm.com) 点击”Download for Windows”,跳转至详细下载页面。 以Windows6…

    Java 2023年6月8日
    097
  • 从Go编程看IO多路复用Epoll

    IO多路复用使得一个线程就可就可以处理多个网络连接,无需要创建多个线程来处理多个socket连接,减少不必要的资源开销,但是Select还是Poll、Epoll模式都有着不同的区别…

    Java 2023年6月16日
    079
  • 面试突击69:TCP 可靠吗?为什么?

    相比于 UDP 来说,TCP 的主要特性是三个:有连接、可靠、面向数据流。所谓的”有连接”指的是 TCP 中的连接管理机制,也就是著名的三次握手和四次挥手,…

    Java 2023年5月29日
    084
  • Spring boot——JMX 监控

    spring.jmx.enabled=true 在命令行中执行 jconsole命令启动”Java管理和监视控制台”,然后选择org.springframe…

    Java 2023年5月30日
    085
  • this.$refs[formName].validate((valid) =>{} 无效,vue验证表单无效

    问题: this.$refs[formName].validate((valid) =>{}无效的问题,当验证通过的时候点确定按钮没有报错,也没有任何反应。 背景: ruoy…

    Java 2023年6月14日
    047
  • 二、计算机基础

    计算机基础 前言 首先,这是一个很基础的知识,本来是不打算写的,但是考虑到这套笔记的完整性,还有一些人刚接触计算机,所以还是记一下会好一些。 基础知识普及 计算机 英文名: Com…

    Java 2023年6月7日
    095
  • RocketMQ的push消费方式实现的太聪明了

    大家好,我是三友,我又来了~~ 最近仍然畅游在RocketMQ的源码中,这几天刚好翻到了消费者的源码,发现RocketMQ的对于push消费方式的实现简直太聪明了,所以趁着我脑子里…

    Java 2023年6月16日
    0125
  • Java 8 后的新功能梳理

    为什么要写这篇文章 经过了若干年的发展,Java逐步从 java8升级为 java11, java17。 让我们对比学习一下最新一版的LTS版本和 java8比起来让代码简化了多少…

    Java 2023年6月8日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球