面试题答案
一键面试基本设计原理
- 使用Hash数据结构:Redis 中可利用 Hash 数据结构来实现可重入锁。Hash 结构以键值对形式存储数据,一个 key 可对应多个 field - value 对。在此场景下,锁的 key 作为 Hash 的 key,而 value 可以设计为包含当前持有锁的线程标识(如线程 ID)和重入次数的结构。
- 获取锁操作:当线程尝试获取锁时,使用
HSETNX
命令(HSETNX key field value
)。如果该锁对应的 Hash 结构不存在(即锁未被占用),则HSETNX
会设置成功并返回 1,表示获取锁成功。此时 Hash 结构中添加了一个新的 entry,field 可以是当前线程标识,value 初始化为 1(代表重入次数为 1)。如果锁已被其他线程占用(Hash 结构已存在且对应 field 为其他线程标识),则HSETNX
返回 0,获取锁失败。若锁已被当前线程持有(Hash 结构存在且对应 field 为当前线程标识),则使用HINCRBY
命令(HINCRBY key field increment
)将重入次数加 1。 - 释放锁操作:释放锁时,首先使用
HGET
命令获取当前线程对应的重入次数。如果重入次数大于 1,使用HINCRBY
命令将重入次数减 1。如果重入次数等于 1,使用HDEL
命令(HDEL key field
)删除 Hash 结构中当前线程对应的 entry。若 Hash 结构中所有 entry 都被删除(即锁被完全释放),此时整个 Hash 结构也会被删除。通过这样的设计,结合 Hash 数据结构及相关操作命令,实现了 Redis 分布式锁的可重入性。