Redis分布式锁

本文介绍了分布式锁在分布式系统中的应用,如防止超卖的买票场景。讲述了如何利用setnx配合过期时间处理服务器故障,以及如何通过lua脚本解决误解锁问题。重点介绍了watch-dog机制和redlock算法,以确保在主节点故障后的系统可用性与数据一致性。
摘要由CSDN通过智能技术生成

什么是分布式锁

分布式锁是在分布式系统中,保证Redis数据一致性的手段。类似std::mutex,但是这个仅限于单个进程,不适用于分布式系统。

适用于什么场景

买票场景下,防止出现“超卖”的情况,所以需要加上分布式锁:

给redis加锁的其实是又一个服务器。

分布式锁的实质 

 

因为setnx的性质正好符合我们的预期,所以一般加锁会配合setnx使用。

服务器宕机了怎么办 

可以利用set ex nx设置锁的过期时间,解决了服务器崩了没有正常释放锁的问题。不建议分别使用两个命令,set nx和expire。因为redis不能多个命令保证原子性,所以可能存在一条命令执行成功但是另一条失败的情况。而且就算排除了失败的情况,那么多次与服务器通信总比一次要更影响效率。

其他服务器误解锁了怎么办

引入lua脚本 

有这样一种情况:服务器2要在多线程的服务器1中的线程B执行DEL之前进行加锁。但是在这种情况下,就会导致服务器2刚加上的锁就被解除了。因为在GET的时候,已经通过了校验,因为此时的锁的id正是服务器1的id。校验成功后,就可以执行DEL命令。

解决方法有两种,一是实现redis的事务,保证线程B的两个命令是原子执行的。二是引入lua脚本,官方文档也说明lua脚本是事务的代替方案。执行lua脚本是原子的,可以写多个命令。在这种情况下,可以这样写:

watch-dog

当我们考虑要给锁设置过期时间时,过短过长都不太合适,所以引入了watch-dog的机制:

 

redlock算法

假设进行加锁的redis服务器挂了。虽然它会通过哨兵进行监控,并时刻准备着把从节点当作主节点的工作。但是主节点同步给从节点是有延迟的。倘若在同步锁这个数据之前,就挂了。虽然从节点被换了上来不影响加锁的功能。但是之前加的锁的数据从节点不知道。这个时候就需要引入redlock算法了。

如何实现:

总结:单个Redis实例可能存在单点故障的风险,一旦发生故障,可能导致锁的不可用。Redlock算法通过在多个Redis实例之间创建相同的分布式锁,能够提高系统的可用性和可靠性。 

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值