MST

星途 面试题库

面试题:Redis中SETNX与EXPIRE组合实现分布式锁有哪些常见缺陷

请详细阐述在使用Redis的SETNX命令设置锁,以及EXPIRE命令设置锁过期时间这种组合方式时,可能会出现的缺陷。
47.4万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 命令非原子性问题

  • SETNX用于设置锁,如果键不存在则设置成功返回1,否则返回0。EXPIRE用于设置键的过期时间。在使用SETNX设置锁成功后,若在执行EXPIRE设置过期时间之前,服务器发生崩溃等异常情况,那么这个锁就会永远存在,无法自动释放,导致死锁。因为这两个命令并非原子操作,在分布式环境下这是一个严重问题。

2. 锁误释放问题

  • 假设线程A获取到锁并设置了过期时间,由于业务执行时间较长,锁过期自动释放。此时线程B获取到锁开始执行任务,而线程A执行完业务逻辑后,它不知道锁已经过期并被线程B获取,仍然会去执行释放锁的操作(例如DEL命令),这样就会误释放线程B的锁,导致后续可能出现并发问题。

3. 时钟漂移问题

  • 在分布式系统中,不同节点的时钟可能存在误差(时钟漂移)。如果系统时钟发生较大偏移,可能导致锁的过期时间设置不准确。例如,节点A设置锁的过期时间为10秒,但由于时钟漂移,在节点B看来,这个锁可能在更短或更长时间后才过期,这可能引发锁机制的不稳定,甚至导致并发问题。