一、什么是分布式锁
我们在上篇文章中实现了单机模式下的秒杀业务。其中采用了synchronized加锁来解决各种线程安全问题。而synchronized关键字是依赖于单机的JVM,在集群模式下,每个服务器都有独立的JVM,如果此时还采用synchronized关键字加锁,就会导致不同服务器间出现线程安全问题:
这时我们就需要一个不依赖JVM的独立的锁,去统一地对多台服务器进行加锁操作:
像这样独立出来的锁就被称之为分布式锁。
一个优秀的分布式锁需要满足以下特性:
- 多进程可见
- 互斥
- 高可用
- 高性能
- 安全性
- ……
二、分布式锁的实现
分布式锁的核心是实现多进程之间的互斥,常见的有三种实现方式:
相比之下redis在性能上是最好的,本篇文章就主要来探讨用redis来实现一个分布式锁。
Redis实现简单的分布式锁
这里的锁最重要的一个特点就是需要具备互斥性。redis中的setnx操作,在key不存在的时候可以写入,key如果存在就将无法写入,就很符合互斥性的特点。
这样我们就可以尝试用setnx操作来自己实现一个互斥锁SimpleRedisLock:
加锁时会执行setnx操作向Redis中添加锁信息。由于setnx的互斥性,只有第一个执行setnx操作的线程才能成功执行写入操作,并返回成功信息,则表示着加锁成功;此时其它线程尝试获取锁去执行setnx操作就会失败,返回错误信息,则表示加锁失败,进入阻塞等待。这样就实现了一个简单的锁的功能。
同时为了避免某个线程在获取锁后执行时间过长导致大量线程长时间处于阻塞态&#x