上期文章我们聊了一下**【大厂必备】系列之Redis雪崩、击穿、穿透**,相信大家一定收获满满,这些可是进入大厂的必备板砖啊,这期我们接着放大招,来聊聊让人胆颤心惊的Redis分布式锁,哈哈哈……
生活中,锁一般是被用于隔离两个空间或物体,比如,你用一把锁把你的心爱的宝贝锁起来,以防别人窃走。而在计算机世界里,因为资源往往是有限的,多个用户或请求同时请求某一资源,就会出现资源竞争问题,所以,锁主要是用来解决资源共享的问题。
分布式锁就是专门用来解决分布式应用之间共享资源的高并发问题。目前业界主流的实现方式有基于ZooKeeper和Redis两种,这篇我们主要介绍基于Redis的分布式锁。
分布式锁是什么
我们知道,随着互联应用的发展,单个服务器很难抗住所有压力,这时候就需要把功能分布到不同的机器上面,而在分布式环境下,基于本地单机的锁是无法控制分布式系统中分开部署客户端的并发行为,所以需要分布式锁。
实现分布式锁必须同时满足的四个条件:
1)互斥性,在任意时刻,只有一个客户端能持有锁;
2)不会发生死锁,即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其它客户端能加锁;
3)容错性,只要大部分的Redis节点运行正常,客户端就可以加锁和解锁;
4)加锁和解锁必须是同一个客户端;
Redis分布式锁的实现
Redis中主要通过SETNX命令来实现分布式锁的功能,
格式如下:
SETNX key value
如果不存在,则设置key为保存的字符串,在这种情况下,它等于SET,当已经有值的时候,不执行任何操作;
返回值:
1 已设置了key
0 未设置key
示例:
redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"
redis>
SETNX底层源码
这是分布锁SETNX指令最底层的源码(t_stri