面试题答案
一键面试基础技术或组件
- Redis:Redis是一个高性能的键值对存储数据库,支持多种数据结构。它可以利用自身的原子操作来实现锁机制。例如,使用
SETNX
命令(Set if Not eXists),当且仅当键不存在时,才会设置键的值。 - Zookeeper:Zookeeper是一个分布式协调服务框架,它以树形结构存储数据。利用其临时顺序节点和监听机制来实现分布式锁。
- 数据库:常见的关系型数据库(如MySQL)也可以用来实现全局锁。可以通过在数据库表中插入或删除记录来模拟锁的获取和释放操作。例如,利用
SELECT... FOR UPDATE
语句对某条记录加锁,防止其他事务同时修改。
协同工作方式
- 基于Redis实现全局锁:
- 获取锁:客户端使用
SETNX
命令尝试在Redis中设置一个特定的键值对,如果设置成功,表示获取到锁;否则,表示锁已被其他客户端持有。例如:SETNX lock_key unique_value
,其中unique_value
是每个客户端生成的唯一标识,用于后续释放锁时验证。 - 释放锁:客户端释放锁时,首先验证当前锁的
unique_value
是否与自己持有的一致,若一致则使用DEL
命令删除该键值对,释放锁。
- 获取锁:客户端使用
- 基于Zookeeper实现全局锁:
- 获取锁:客户端在Zookeeper的指定节点下创建一个临时顺序节点。然后获取该节点下所有子节点并排序,若自己创建的节点序号最小,则获取到锁;否则,对前一个序号的节点设置监听,等待前一个节点释放锁。
- 释放锁:持有锁的客户端操作完成后,删除自己创建的临时顺序节点,Zookeeper会通知下一个序号的客户端,该客户端检测到监听事件后,重新判断自己是否为最小序号节点,若是则获取锁。
- 基于数据库实现全局锁:
- 获取锁:客户端执行
SELECT... FOR UPDATE
语句,锁定数据库表中的特定记录。例如:SELECT * FROM lock_table WHERE lock_key = '特定值' FOR UPDATE
,此时其他事务尝试执行相同的查询语句时会被阻塞,直到当前事务提交或回滚。 - 释放锁:客户端完成操作后,提交事务,数据库自动释放对该记录的锁,其他事务可以竞争获取锁。
- 获取锁:客户端执行