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

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.lryc.cn/news/432515.html

相关文章:

  • 项目实战 ---- 商用落地视频搜索系统(5)---service层核心
  • Win32远线程注入
  • CTF 竞赛密码学方向学习路径规划
  • 2024数学建模国赛B题代码
  • PyTorch 卷积层详解
  • 【Kubernetes知识点问答题】kubernetes 控制器
  • Patlibc———更快捷的更换libc
  • 基于飞腾平台的Hive的安装配置
  • c# json使用
  • 单点登录:cas单点登录实现原理浅析
  • java报错
  • uniapp动态页面API
  • 最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法
  • 每日OJ_牛客_骆驼命名法(递归深搜)
  • MySQL 数据库管理与操作指南
  • Android Manifest 权限描述大全对照表
  • Ollama Qwen2 支持 Function Calling
  • APP测试工程师岗位面试题
  • 如何进行 AWS 云监控
  • 第十六篇:走入计算机网络的传输层--传输层概述
  • 提升效率!ArcGIS中创建脚本工具
  • 无人机之报警器的作用
  • 风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架
  • python文件自动化(4)
  • HTTP 方法
  • 通过redis-operator 来部署 Redis Cluster 集群
  • vue3集成sql语句编辑器
  • Optuna发布 4.0 重大更新:多目标TPESampler自动化超参数优化速度提升显著
  • https和harbor仓库跟k8s
  • 云计算之网络