玉林社区   玉林商家自荐   数据显示:Redis怎么现分布式锁
返回列表
查看: 470|回复: 0

数据显示:Redis怎么现分布式锁

[复制链接]

1413

主题

1413

帖子

5373

积分

论坛元老

Rank: 8Rank: 8

积分
5373
发表于 2022-2-23 22:13:59 | 显示全部楼层 |阅读模式

马上注册玉林红豆网会员,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

阿粉最近迷上了R,为什么呢感觉R确功能很强大呀,一个基于内存的系统K-V存储的数据库,竟然有这么多的功能,而阿粉也要在在地把R来弄一下,毕竟面试的时候,R可以说是一个非常不错的加分项。阿粉最近迷上了R,为什么呢?感觉R确功能很强大呀,一个基于内存的系统K-V存储的数据库,竟然有这么多的功能,而阿粉也要在在地把R来弄一下,毕竟面试的时候,R可以说是一个非常不错的加分项。[url=http:///www.wangsu.com/]视频加速[/url]的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖![align=center]

                               
登录/注册后可看大图
[/align]





分布式锁
为什么需要分布式锁?


目前很多的大型项目全部都是基于分布式的,而分布式场景中的数据一致性问题一直是一个不可忽视的问题,大家知道关于分布式的CAP理论么?


CAP理论就是说任何一个分布式系统都法同时满足一致性(C)、可用性(A)和分区容错性(P),最多只能同时满足两项。


而我们的系统最终满足的永远都是最终一致性,而这种最终一致性,有些时候有人会喜欢问关于分布式事务,而有些人则偏重在分布式锁上。


分布式锁的种类

数据库现分布式锁
缓存现分布式锁
Z现分布式锁

但是阿粉选择的就是使用缓存来现分布式锁,也就是我们在项目中最经常使用的R,谈到R,那真是可以用在太多地方了,比如说:



会话缓存
消息队列
分布式锁
发布,订阅消息
商品列表,评论列表

我们今天就来现用R来现分布式锁,并且要学会怎么使用。


准备工作
1准备使用J的包,在项目中导入包。











!----IIII290



直接来写个工具类吧!


RPU{SLOCK_SUCCESS=OK;SSET_IF_NOT_EXIST=NX;SSET_WITH_EXPIRE_TIME=PX;RPU(){}****@*@K加锁*@I请求的标志位*@T超时时间*@*GDL(J,SK,SI,T){S=(K,I,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,T);(LOCK_SUCCESS()){;}{{T(10);休眠100毫秒}(E){ST();}};}}
(K,I,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,T);这个加锁的姿势才是我们最需要了解的,不然你用的时候都不知道怎么使用。


:加锁的键,际上就是相当于一个唯一的标志位,不同的业务,你可以使用不同的标志位进行加锁。


I:这个东西际上就是用来标识他是哪一个请求进行的加锁,因为在分布式锁中,我们要知道一件事,就是加锁的和解锁的,必须是同一个客户端才可以。


而且还有一种比较经典的就是B把A的锁给释放了,导致释放混乱,如果你不加相同的请求,A线程处理业务,执行了加锁,锁的过期时间是5,B线程尝试获取锁,如果A处理业务时间超过5,这时候A就要开始释放锁,而B在这时候没有检测到这个锁,从而进行了加锁,这时候加锁的时候,A还没处理完对应业务,当他处理完了之后,再释放锁的话,要是就是直接把B刚加的锁释放了,要么就是压根都没办法释放锁。


SET_IF_NOT_EXIST:看字面意思,如果不存在,我们进行S操作,如果存在,啥都不干,也就不在进行加锁。


SET_WITH_EXPIRE_TIME:是否过期


T:这是给设置一个过期的时间,万一你这业务一直被锁着了,然后之后的业务想加锁,你直接给一直持有这个这个锁,不进行过期之后的释放,那岂不是要凉了。


上面的方法中GDL这个方法也就是我们通常使用的加锁的方法。


解锁
DL(J,SK,SI){S=('',KEYS[1])==ARGV[1]('',KEYS[1])0;O=(,CL(K),CL(I));(OK()){;};}
大家看到这个的时候,会感觉有点奇怪,际上他就是一个L的脚本,而L脚本的意思也比较简单。



先获取锁对应的值,检查是否与I相等
如果相等则删除锁(解锁)
执行()方法

其这时候就有些人说,直接删除不行么?你试试你如果这么写的话,你们的会不会把你的腿给你打断。


这种不先判断锁的拥有者而直接解锁的方式,会导致任何客户端都可以随时进行解锁,也就是说,这锁就算不是我加的,我都能开,这怎么能行呢?





在这里给大家放一段使用的代码,比较简单,但是可以直接用到你们的项目当中。


{B=RPUGDL(,,,5000);(){代码片段}{}}(){}{RPUDL(,,);}
分布式锁的要求

满足互斥性。也就是说不管在什么时候,只有一个客户端能够持有锁,不能是多个客户端。
不能出现死锁。就是说,如果要现分布式锁,不能说当一个锁没有释放的时候,其他的客户端不能进行加锁,要保证不影响其他的客户端加锁。
加锁和解锁必须是同一个客户端

分布式的CAP理论
我们先把这个现方式现了,然后我们再来说说大家最不愿意看的理论知识,毕竟这理论知识是你面试的时候经常会被问到的。


分布式CAP理论:


加州大学伯克利分校的EB教授在ACMPODC会议上提出CAP猜想。2年后,麻省理工学院的SG和NL从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。


也就是说,在二十年前的时候,CAP理论只是个猜想。结果两年之后被证了,于是,大家在考虑分布式的时候,就有根据来想了,不再是空想了。


什么是分布式的CAP理论?
一个分布式系统最多只能同时满足一致性(C)、可用性(A)和分区容错性(P)这项中的两项。





这个和(A)不太一样,因为之前看有些人说,在CAP理论中的A和数据库事务中的A是一样的,单词都不一样,那能一样么?


A:分布式中的A表示的是可用性,也就是说服务一直可用,而且是正常响应时间。


而你在搭建分布式系统的时候,要保证每个节点都是稳定的,不然你的可用性就没有得到相对应的保证,也谈不上是什么分布式了。只能称之为一个伪分布式。


C:一致性
也就是说你的更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,这个如果你在使用R做数据展示的时候,很多面试官都会问你,那你们是怎么保证数据库和缓存的一致性的呢?


毕竟你只是读取的话,没什么问题,但是设计到更新的时候,不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。


所以如果你对这个很感兴趣,可以研究一下,比如说:



延时双删策略
懒加载懒加载可采取双删+TTL失效来现
主动加载

如果你能在面试的时候把这些都给面试官说清楚,至少感觉你应该能达到你自己的工资要求。


P:分区容错性
分布式系统在遇到某节点或络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。


其在CAP理论当中,我们是没有办法同时满足一致性、可用性和分区容错性这个特性,所以有所取舍就可以了。


关于使用R分布式锁,大家学会了么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

收藏:1 | 帖子:5万



侵权举报:本页面所涉内容均为用户发表并上传,岭南都会网仅提供存储服务,岭南都会网不承担相应的法律责任;如存在侵权问题,请权利人与岭南都会网联系删除!