之前写了两篇有关线程安全的文章:
- 你管这叫线程安全?
- .NET八股文:线程同步技术解读
分布式锁是"线程同步"的延续
最近首度应用"分布式锁",现在想想,分布式锁不是孤立的技能点,这其实就是跨主机的线程同步。
进程内 |
跨进程 |
跨主机 |
Lock/Monitor、SemaphoreSlim |
Metux、Semaphore |
分布式锁 |
用户态线程安全 |
内核态线程安全 |
|
单机服务器可以通过共享某堆内存来标记上锁/解锁,线程同步说到底是建立在单机操作系统的用户态/内核态对共享内存的访问控制。
而分布式服务器不是在同一台机器上:跨主机,因此需要将内存标记存储在所有机器进程都能看到的地方。
在开发很多业务场景会使用到锁,例如库存控制,抽奖等。
例如库存只剩1个商品,有三个用户同时打算购买,谁先购买库存立即清零,不能让其他二人也购买成功。
解读分布式锁
我们常说的线程安全、线程同步方案,包括此次的分布式锁都是基于“多线程/多进程对特定资源有更新操作”。
基本考量:
- 分布式系统,一个锁在同一时间只能被一个服务器获取 (这是分布式锁的基础)
- 具备锁失效机制,防止死锁 (防止某些意外,锁没有得到释放,那别人也无法得到锁)
Redis SET resource-name anystring NX EX max-lock-time
是一种最简单的分布式锁实现方案。
SET 命令支持多个参数: