当前位置: 首页 > article >正文

redis分布式锁和lua脚本

业务场景:多个线程对共同资源的访问:库存超卖/用户重复下单的原因

解决方法一:利用jvm内置锁,将非原子性操作变成原子性操作

Synchronized锁的是对象,对象必须是单例的。锁的是this,代表当前所在的类,这个类是交给Spring 管理的。所有以是单例模式的,所以可以锁住

为什么在分布式项目中不使用synorchronized同步锁:

因为jvm的synorchonized只能保证自己的服务,在集群部署的时候有多个服务,锁不住jvm服务。jvm的内置锁只能解决单体式项目中的并发问题,但是在分布式环境下,无法解决多jvm实例的并发。

分布式锁的实现

分布式事务锁的要素

  1. 锁哪个对象 => 锁指定场次下的指定商品
  2. 当多线程同时加锁时,只能有一个线程加锁成功=>Redis的setnx命令。例如使用setnx秒杀场次+秒杀商品id
  3. 锁记录在什么地方 => 利用redis的setnx命令存储在Redis的String数据结构中
  4. 当线程获取不到锁的时候,执行什么策略 => 阻塞/自旋等待(限制次数)/直接抛异常

Finally 释放锁

这么写会造成锁的问题

如果加完redis的key以后程序挂了,那么这个key就释放不了,就会一直在里面,会造成死锁:解决方式——设置超时时间

但是存键值和设置超时时间是两个操作,不是一个完整的原子性操作

利用LUA脚本进行操作,定义加载lua脚本的配置

在resource下面新建lua脚本

在代码中执行lua脚本保证命令的原子性


http://www.kler.cn/a/297321.html

相关文章:

  • VM kali2023挂载共享文件夹
  • Python 检测人脸筛选指定尺寸人脸图片
  • UI自动化-元素动作WebElement源码类
  • 标题:探索 HTML 与 JavaScript 实现的选项卡切换效果
  • 已解决:javax.xml.datatype.DatatypeConfigurationException 异常的正确解决方法,亲测有效!!!
  • 【软件设计】常用设计模式--工厂模式
  • React 事件系统解析
  • Optuna的使用
  • 探索 Web Vibration API 震动反馈:为网页增添触觉反馈
  • win的使用
  • 算法工程师重生之第二天(长度最小的子数组 螺旋矩阵II 区间和 开发商购买土地 总结 )
  • 嵌入式Linux学习笔记-C语言编译过程
  • 智能对决:提示词攻防中的AI安全博弈
  • 8、用户行为数据同步
  • 数学建模常见模型(下)
  • 高精度蓝光三维扫描仪用于小型精密零部件3D检测
  • 本地搭建 Whisper 语音识别模型
  • 美股开户网:iPhone 16系列今年出货预估上调至8800~8900万部
  • 类与结构体实例(Class和Struct)——C#学习笔记
  • 最近对GFM有点感兴趣,偶读石川老师关于这方面的文章,很感兴趣,整理他的讲稿如下