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

相关推荐
小尔¥6 分钟前
MySQL故障排查与优化
运维·数据库·mysql
独断万古他化7 分钟前
抽奖系统性能负载测试:基于 JMeter 的梯度加压与本地缓存优化全流程
java·redis·jmeter·缓存·压力测试·测试·负载测试
rrrjqy11 分钟前
Redis常见问题(一)
数据库·redis·缓存
Humbunklung13 分钟前
WMO 天气代码(Code Table 4677)深度解析与应用报告
开发语言·数据库·python
道清茗22 分钟前
【MySQL知识点问答题】锁机制、索引优化与数据库恢复方法
数据库·mysql
hero.fei35 分钟前
排查redis出现报错ERR redis temporary failure
数据库·redis·缓存
野犬寒鸦43 分钟前
MySQL复习记录Day01
数据库·后端
ward RINL1 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
问道飞鱼1 小时前
【分布式技术】分布式对象存储服务RustFS
分布式·对象存储·rustfs
RisunJan1 小时前
Linux命令-mysqldump(MySQL数据库中备份工具)
linux·数据库·mysql