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

相关推荐
hhzz4 分钟前
【回顾MySQL的SQL基础开发与应用】SQL分类与数据类型、视图、触发器以及存储过程与事件
数据库·sql·mysql
Howie Zphile7 分钟前
FRAPPE v16 +postgresql +insight+wiki安装
数据库·postgresql·frappe·全面预算
专注VB编程开发20年12 分钟前
C#,VB.NET多台电脑读取REDIS服务器,如何保证数据不会冲突
前端·redis·bootstrap·html
笨蛋不要掉眼泪13 分钟前
Spring Cloud Alibaba Sentinel 从入门到实战:微服务稳定性的守护者
分布式·微服务·云原生·架构·sentinel
枷锁—sha22 分钟前
【SRC】SSRF (服务端请求伪造) 专项挖掘与实战笔记
数据库·笔记·安全·网络安全
知识分享小能手29 分钟前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 触发器 — 语法知识点及使用方法详解(17)
数据库·学习·sqlserver
tod11333 分钟前
Redis Sentinel 高可用架构:从原理到 Docker 部署全解析
数据库·redis·docker·架构·sentinel
014-code35 分钟前
Redis 是如何实现与数据库的一致性呢?
数据库·redis·缓存
清水白石00842 分钟前
缓存的艺术:Python 高性能编程中的策略选择与全景实战
开发语言·数据库·python
AI Echoes1 小时前
对接自定义向量数据库的配置与使用
数据库·人工智能·python·langchain·prompt·agent