大家好,我系渣渣骥,今天跟大家分享的面试题是:谈一谈Redis的分布式锁
首先,为什么要使用分布式锁?
现在的架构都不再是单体架构,而是由多个微服务组成的分布式架构。
假设现在微服务A部署在三台服务器A1,A2,A3上, 使用了轮询的策略(即第一次请求访问 A1,第二次A2,第三次A3)。
此时,如果有一些共享的资源,不使用分布式锁,A1,A2,A3之间就不知道对方加锁了(因为它们是不同的服务器,拥有不同的进程),依然会引发并发问题,这时候就需要分布式锁(诸如使用Zookeeper或Redis做分布式锁)来保证并发操作时数据的一致性。
那么为什么要选择Redis做分布式锁呢?因为使用Redis做分布式锁性能是最佳的,比Zookeeper做分布式锁性能好,但是Zookeeper做分布式锁可靠性更高。所以不同的业务场景应该选择不同的锁。通常的建议是,像金融系统这种需要超高可靠性的场景,选则久经沙场的Zookeeper会是更好的选择。
那么,如何使用Redis做分布式锁呢?
以往,大家喜欢于使用Redis的SENTX+EXPIRE的组合来实现分布式锁。但是,这种方法有缺陷,官方已经不推荐使用了。比如在Redis集群模式下使用SENTX,如果Master节点获取锁,但是Msater节点还没来得及同步数据到集群中其它节点之前崩溃了,新的Master节点仍然可以获取锁,这样就会出现多个应用服务获取锁的情况。
目前,Redis官方推荐使用Redission操作Redis,因为Redission是使用netty实现的,实现了无阻塞通信,相比Jedis来说会拥有更好的性能。
另外,为了避免SENTX方案中多个服务获取锁的问题,Redission使用了Redlock算法获取锁。
Redlock算法思路大体如下:
1).获取锁都有一个超时时间,如果超时了则认为获取锁失败
2).在各个Redis节点上,尝试去获取锁,成功获取锁的Redis节点数超过总结点数(N)的一半加1(即N/2 + 1),且没有超时的情况下,则认为成功获取锁。
用户评论