谷粒商城实战(009 缓存-分布式锁)

admin2024-04-03  1

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强

总时长 104:45:00 共408P

此文章包含第158p-第p165的内容


分布式锁

原理和使用

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第1张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第2张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第3张
使用下shell对产生的命令进行发送
查看 -> 撰写 -> 撰写栏

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第4张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第5张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第6张

idea 选中的代码提取成方法
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第7张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第8张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第9张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第10张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第11张

加锁和过期时间是一个原子操作 就可以避免死锁
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第12张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第13张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第14张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第15张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第16张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第17张

使用lua

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第18张

也可以全部用lua脚本写分布式锁,这种一半Java代码,一半Redis运行代码,受网络原因影响很大 。网上有基于lua脚本实现的分布式锁 。
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第19张

原子删锁
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第20张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第21张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第22张
怕业务未执行完锁就过期了,可以给过期时间设置长一些 如300秒
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第23张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第24张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第25张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第26张

redis自己实现分布式锁的最大的问题就是自旋,自旋消耗cpu资源,所以还是得中间件进行阻塞,比如zookeeper。
ZooKeeper 可以作为解决自旋问题的一种工具或组件的一部分。在分布式系统中,如果多个节点或线程需要协调访问某个共享资源,可以借助 ZooKeeper 提供的分布式锁机制来解决自旋问题。

具体来说,当一个节点或线程需要访问共享资源时,它可以尝试获取一个分布式锁。如果锁已经被其他节点或线程持有,那么它可以选择在获取锁之前自旋一段时间,等待锁释放。当锁释放时,它再次尝试获取锁。如果自旋等待的时间过长,也可以选择放弃自旋,暂时释放 CPU 控制权,并稍后再次尝试获取锁。

总的来说,虽然 ZooKeeper 本身并不直接解决自旋问题,但它提供了一种分布式锁的实现,可以帮助分布式系统中的节点或线程协调访问共享资源,从而间接地解决自旋问题。

使用更专业的Redisson进行分布式锁操作

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第27张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第28张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第29张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第30张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第31张
第二个带配置,我们使用第一个原生的

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第32张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第33张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第34张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第35张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第36张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第37张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第38张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第39张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第40张
单元测试
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第41张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第42张

可重入锁

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第43张

注入的变量名称最好可以和配置类里的名称(组件ID)一样(不一样也可以)
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第44张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第45张
继承了juc包下的Lock类
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第46张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第47张
阻塞式等待,不需要自旋了
(无锁自旋和重量级锁)
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第48张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第49张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第50张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第51张
使用了redis的看门狗 会自动续期
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第52张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第53张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第54张

redis 看门狗原理

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第55张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第56张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第57张

这里看不懂应该去学习手动使用redis实现分布式锁,框架是对手动的封装,看不懂很正常
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第58张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第59张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第60张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第61张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第62张

读写锁

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第63张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第64张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第65张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第66张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第67张
写成功才能读到
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第68张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第69张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第70张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第71张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第72张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第73张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第74张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第75张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第76张

闭锁

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第77张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第78张
Latch翻译:门闩(shaun)
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第79张
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第80张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第81张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第82张

juc lock的用法如下选中的蓝色代码
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第83张

信号量

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第84张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第85张

设置3个车位
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第86张

值变成0后无法继续停车(请求阻塞)
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第87张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第88张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第89张
可以利用信号量进行限流操作
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第90张

使用tryAcquire 不会阻塞 会直接返回false,利用false可以返回一个页面给客户,让样客户可以看到当前爆满,请稍后重试这样的页面
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第91张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第92张

error那里可以直接写当前流量过大,请稍后重试
谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第93张

谷粒商城实战(009 缓存-分布式锁),在这里插入图片描述,第94张


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!