面试题答案
一键面试分布式锁控制共享资源访问避免数据冲突的方式
- 获取锁:当微服务需要访问共享资源时,首先尝试获取分布式锁。只有获取到锁的微服务才能继续后续操作,若获取锁失败,则等待或重试。
- 访问资源:成功获取锁的微服务对共享资源进行操作,如读取或修改数据库记录。
- 释放锁:操作完成后,该微服务及时释放锁,以便其他微服务有机会获取锁并访问共享资源。
常用分布式锁实现方式及原理
- 基于 Redis 的分布式锁
- 原理:利用 Redis 的单线程特性和原子操作。例如使用
SETNX
(SET if Not eXists)命令,当 key 不存在时,将 key 设置为 value,返回 1,表示获取锁成功;若 key 已存在,返回 0,表示获取锁失败。为防止死锁,一般会给锁设置过期时间。释放锁时,通过 Lua 脚本保证删除操作的原子性,确保只有加锁的客户端能释放锁。
- 原理:利用 Redis 的单线程特性和原子操作。例如使用
- 基于 ZooKeeper 的分布式锁
- 原理:利用 ZooKeeper 的树形结构和顺序节点特性。客户端在指定目录下创建一个临时顺序节点,获取锁时,比较自己创建节点的序号与目录下所有子节点序号,若自己的序号最小,则获取锁成功。若获取失败,则监听比自己序号小的前一个节点,当前一个节点删除时,收到通知后再次尝试获取锁。当客户端断开连接,临时节点会自动删除,从而释放锁。