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脚本保证命令的原子性

相关推荐
Absurd5873 分钟前
PHP怎么实现SAML单点登录_PHP企业级SSO解决方案【指南】
jvm·数据库·python
JZC_xiaozhong3 分钟前
连锁餐饮企业如何统一ERP、WMS、BOH多系统权限?一套可落地的IAM架构方案
大数据·数据库·架构·iam·企业数据安全·数据集成与应用集成·多系统权限管理
2301_796588505 分钟前
PHP源码能否在无盘工作站运行_网络启动硬件要求【说明】
jvm·数据库·python
qq_424098567 分钟前
CSS如何让文字超出两行显示省略号_使用line-clamp属性限制
jvm·数据库·python
qq_372906938 分钟前
如何重命名SQL触发器名称_使用sp_rename重新定义标识
jvm·数据库·python
解救女汉子9 分钟前
SQL如何统计每日新增用户数_窗口函数与日期维度的结合
jvm·数据库·python
djjdjdjdjjdj16 分钟前
PyTorch bfloat16 张量转 NumPy 的兼容性解决方案
jvm·数据库·python
Greyson118 分钟前
实现 Flex 容器内子元素自适应高度并启用自动滚动
jvm·数据库·python
xyghehehehe18 分钟前
【MySQL深入详解】第11篇:内存与IO配置——InnoDB核心参数调优
数据库
m0_5964063718 分钟前
Redis如何配置主从复制关系_利用REPLICAOF命令将节点挂载至主节点
jvm·数据库·python