当前位置:网站首页>场景化面试:关于分布式锁的十问十答
场景化面试:关于分布式锁的十问十答
2022-07-05 21:26:00 【InfoQ】
- 互斥性:在分布式高并发条件下,同一时刻只有一个线程可以获得锁。
- 超时机制:锁服务和请求锁的服务分散在不同的机器上面,它们之间是通过网络来通信的,所以我们需要用超时机制,来避免获得锁的节点故障或者网络异常,导致它持有的锁不能释放,出现死锁的情况。
- 可重入性:一个节点的一个线程如果已经获得这把锁,那么这个线程在持有锁的期间,可以再次成功获取锁。
- 公平性:根据具体的实现,锁可以分为公平锁和非公平锁,假如目前有三个线程在竞争同意把锁,线程 A 成功获得锁,线程 B 和线程 C 没有获取到并阻塞等待 A 释放锁,且线程 B 先于线程 C 阻塞等待,那么在线程 A 释放锁后,这把锁会被等待时间最长的线程 B 获得,按照先来先得的原则,那么这把锁就是公平锁,反之就是非公平锁。
- 完备的锁接口:即锁的接口定义中,加锁操作要同时提供阻塞式接口 lock 和非阻塞式接口 tryLock,解锁操作要提供 release 接口。
- 基于关系型数据库(例如 MySQL):创建一张表用于记录共享资源信息,对临界资源做唯一性约束,通过增加一条记录来对某个资源加锁,通过删除记录释放锁。
- 基于分布式缓存 Redis :通过调用 Redis 函数 SETNX+EXPIRE 实现,同时为了保证原子性,可以通过 Lua 脚本来实现锁的设置和过期时间的原子性。在 Redis 2.6.12 版本后 SETNX 增加了过期时间参数,也可以直接使用这个重载方法。SETNX 方法返回 1 表示获得 key 所代表的锁,返回 0 表示获取锁失败
- 基于分布式协调服务 ZooKeeper :在对应的持久节点 shared_lock 的目录下为每个进程创建一个临时顺序节点,然后查看哪个进程对应的节点编号最小,最小说明式最先创建的,因此获得锁,否则,等待最小编号节点释放锁。
参考资料
- 《高性能Java架构:核心原理与案例实战》第12章
- 分布式锁:所有的分布式锁都是错误的?
- 分布式锁:关键重地,非请勿入
- 如何设计更优的分布式锁?
关于我
边栏推荐
- Problems encountered in office--
- 校招期间 准备面试算法岗位 该怎么做?
- When a user logs in, there is often a real-time drop-down box. For example, entering an email will @qq com,@163. com,@sohu. com
- Pytoch practice -- MNIST dataset handwritten digit recognition
- Postgres establish connection and delete records
- [daily training -- Tencent select 50] 89 Gray code (only after seeing the solution of the problem)
- Interviewer: will concurrent programming practice meet? (detailed explanation of thread control operation)
- Simple getting started example of Web Service
- MySQL InnoDB Architecture Principle
- Opérations de lecture et d'écriture pour easyexcel
猜你喜欢
随机推荐
终端安全能力验证环境搭建和渗透测试记录
ESP32
How to prepare for the algorithm interview and answer the algorithm interview questions
Some things make feelings nowhere to put
浅聊我和一些编程语言的缘分
Explain various hot issues of Technology (SLB, redis, mysql, Kafka, Clickhouse) in detail from the architecture
【案例】定位的运用-淘宝轮播图
Selenium gets the verification code image in DOM
Test of incombustibility of cement adhesives BS 476-4
Pytoch practice -- MNIST dataset handwritten digit recognition
MySQL deep paging optimization with tens of millions of data, and online failure is rejected!
EN 438-7 laminated sheet products for building covering decoration - CE certification
[case] Application of element display and hiding -- element mask
Modifiers of attributes of TS public, private, protect
Feng Tang's "spring breeze is not as good as you" digital collection, logged into xirang on July 8!
Golang (1) | from environmental preparation to quick start
示波器探头对信号源阻抗的影响
vant 源码解析 event.ts 事件处理 全局函数 addEventListener详解
Zhang Lijun: penetrating uncertainty depends on four "invariants"
int GetMonth( ) const throw( );后面的throw( )什么意思?