java从头开始-黑马点评-分布式锁-redis实现基础版

从上一节课我们发现集群的时候是多进程。使用线程锁已经无法保证安全,因此本节学习分布式锁

解决方式,JVM内部的锁监视器不行,在外面设置一个大家都用的锁监视器不就行了



分布式锁

基于Redis的分布式锁


但是这里有个问题,如果在SETNX和EXPIRE之间出现了宕机,此时锁依然永远无法释放。因此需要保证这两个操作同时成功或失败。但是具体看SET的操作,后面可以加EX和NX来同时实现。



此时redis的锁的等待,也是有两种分别是阻塞式和非阻塞式。阻塞式就是请求不到就一直等待。非阻塞式就是请求不到我们就返回一个失败的结果。因为阻塞式对CPU有浪费,因此后面我们都是使用非阻塞式。

具体实现案例




修改一人一单流程

极端情况下redis实现分布式锁也会出现问题


解决问题的关键就是释放的时候判断线程号是否相同,不同就无需释放了



注意此处使用的是uuid而不是线程号,因为多个进程线程id依然有可能冲突

分布式锁的原子性

JVM垃圾回收的时候会阻塞所有操作,这会导致此时判断锁是否是自己的线程号成功了,但是还没执行释放锁操作就阻塞了。然后在阻塞过程中TTL到期自动释放,此时线程二申请到了锁。但是在线程二保有锁期间线程1阻塞解除。继续执行释放锁操作来删除redis中的锁。此时就会导致线程2申请到的锁被错误释放

Lua脚本解决redis分布式锁原子性问题

解决方式就是保证判断锁与释放锁操作要保证原子性。怎么实现原子性呢,答:使用Lua脚本

Lua简单语法



使用Lua脚本改造分布式锁

创建Lua脚本

脚本初始化

完整调用,此时变成一行代码了,就保证了原子性

相关推荐
磐链科技1 分钟前
交场景下的钱包开发痛点:并发交易与消息推送的分布式一致性技术方案
分布式
凤山老林16 分钟前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅28 分钟前
Spring 核心原理
java·后端·spring
yurenpai(27届找实习中)32 分钟前
从零读懂 AI 智能客服(一):模块职责与 SSE 聊天链路(后端架构)
java·人工智能·架构·langchain4j
会编程的吕洞宾42 分钟前
Redis大Key拖垮线上?排查定位与治理实战
数据库·redis·bootstrap
陈皮波比茶1 小时前
Swagger
java
码农阿豪1 小时前
若依启动突然报 Redis MISCONF?一次从应用报错到磁盘爆满的完整排查记录
数据库·redis·bootstrap
小闫BI设源码1 小时前
Elasticsearch面试必看:如何让客户端精准选择节点高效执行请求?
java·elasticsearch·面试宝典·深入解析
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 5 章 使用 Spring Boot 阅读笔记 9
java·spring boot·笔记
进阶的小名2 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt