基于Redis 的分布式锁
基于缓存实现分布式锁
基于缓存实现分布式锁的方式,非常适合解决这种场景下的问题。所谓基于缓存,也就是说 把数据存放在计算机内存中,不需要写入磁盘,减少了
- 返回
1 ,说明该服务器获得锁,setnx 将key 对应的value 设置为当前时间+ 锁的有效 时间。 - 返回
0 ,说明其他服务器已经获得了锁,进程不能进入临界区。该服务器可以不断尝试setnx 操作,以获得锁。
总结来说
- 性能更好。数据被存放在内存
, 而不是磁盘, 避免了频繁的10 操作。 - 很多缓存可以跨集群部署
, 避免了单点故障问题。 - 很多缓存服务都提供了可以用来实现分布式锁的方法
, 比如Redis 的setnx 方法等。 - 可以直接设置超时时间来控制锁的释放
, 因为这些缓存服务器一般支持自动删除过期数据。
这个方案的不足是,通过超时时间来控制锁的失效时间,并不是十分靠谱,因为一个进程执行时间可能比较长,或受系统进程做内存回收等影响,导致时间超时,从而不正确地释放了
锁。为了解决基于缓存实现的分布式锁的这些问题,我们再来看看基于

可以看到