社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面;
就比如:
本来一个程序员可以完成一个项目:需求->设计->编码->测试
但是项目多的时候,一个人也扛不住,这就需要不同的人进行分工合作了
这就是一个简单的分布式协同工作了;
首先看一个问题,如果说某个环节被终止或者别侵占,就会发生不可知的事情
这就会出现,设计好的或者设计的半成品会被破坏,导致后面环节出错;
这时候,我们就需要引入分布式锁的概念;
何为分布式锁?
分布式锁的条件:
分布式锁的实现:
分布式锁的实现由很多种,文件锁、数据库、redis等等,比较多,在实践中,还是redis做分布式锁性能会高一些;
首先看两个命令:
**setnx:**将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。
127.0.0.1:6379> set lock "unlock"
OK
127.0.0.1:6379> setnx lock "unlock"
(integer) 0
127.0.0.1:6379> setnx lock "lock"
(integer) 0
127.0.0.1:6379>
expire: EXPIRE key seconds
为给定 key
设置生存时间,当 key
过期时(生存时间为 0
),它会被自动删除
127.0.0.1:6379> expire lock 10
(integer) 1
127.0.0.1:6379> ttl lock
8
127.0.0.1:6379> get lock
(nil)
基于分布式锁的流程:
这就是一个简单的分布式锁的实现流程,具体代码实现也很简单,就不赘述了;
如果出现了这么一个问题:如果setnx
是成功的,但是expire
设置失败,那么后面如果出现了释放锁失败的问题,那么这个锁永远也不会被得到,业务将被锁死?
解决的办法:使用set
的命令,同时设置锁和过期时间
set
参数:
set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:设置失效时长,单位秒
PX milliseconds:设置失效时长,单位毫秒
NX:key不存在时设置value,成功返回OK,失败返回(nil)
XX:key存在时设置value,成功返回OK,失败返回(nil)
实践:
127.0.0.1:6379> set unlock "234" EX 100 NX
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set test "111" EX 100 NX
OK
这样就完美的解决了分布式锁的原子性;
想了解学习更多C++后台服务器方面的知识,请关注:
1:6379> set test “111” EX 100 NX
OK
这样就完美的解决了分布式锁的原子性;
***********************
想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:====**CPP后台服务器开发**====
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200314184304213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RyYXZlbGVyd3o=,size_16,color_FFFFFF,t_70)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!