MST

星途 面试题库

面试题:Redis分布式锁中SETNX与EXPIRE组合使用可能会遇到什么问题?

在使用Redis的SETNX命令设置锁,并结合EXPIRE设置过期时间来实现分布式锁时,可能会面临一些潜在的问题,请详细阐述这些问题是什么以及为什么会出现。
32.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 命令原子性问题

  • 问题:在Redis中,虽然SETNX和EXPIRE单个命令是原子性的,但在实现分布式锁时,先执行SETNX设置锁,再执行EXPIRE设置过期时间,这两个操作不是原子的。如果在执行完SETNX后,还没来得及执行EXPIRE时,服务器崩溃,那么这个锁就会变成死锁,其他客户端永远无法获取到该锁。
  • 原因:Redis命令执行的原子性是基于单条命令,而不是多个命令组成的逻辑操作。多个命令间可能会因为服务器故障、网络问题等中断执行,导致整体逻辑不完整。

2. 锁误删问题

  • 问题:假设客户端A获取到锁并设置了过期时间,在处理业务逻辑时,由于某些原因(如网络延迟、业务逻辑复杂等),锁过期了,此时客户端B获取到了这个锁。然后客户端A完成业务逻辑,去释放锁,就会把客户端B的锁释放掉,导致业务逻辑出现错误。
  • 原因:锁的释放逻辑通常是基于锁的键名进行删除操作,没有对锁的持有者进行校验。客户端A不知道锁已经过期并被其他客户端获取,只按照自己获取锁的逻辑去释放锁,从而误删其他客户端的锁。

3. 时钟漂移问题

  • 问题:如果分布式系统中各个服务器的时钟存在误差(时钟漂移),那么设置的过期时间可能与预期不符。例如,在某些服务器上认为锁已经过期可以获取,而在其他服务器上认为锁还未过期,导致锁的不一致,可能出现多个客户端同时持有锁的情况。
  • 原因:不同服务器硬件、操作系统、网络延迟等因素会导致它们的系统时钟存在细微差异。在设置过期时间依赖服务器本地时钟的情况下,时钟漂移会破坏过期时间设置的一致性。

4. 高并发下的性能问题

  • 问题:在高并发场景下,大量客户端同时竞争锁,频繁的SETNX操作会对Redis服务器造成较大压力,可能导致Redis性能下降,甚至出现卡顿,影响整个分布式系统的性能。
  • 原因:Redis是单线程模型,虽然执行单个命令速度很快,但在高并发竞争锁时,大量请求需要排队处理,这会增加每个请求的等待时间,降低系统整体的吞吐量。