Redis实现分布式锁

1,779 阅读1分钟

分布式锁要解决的几个问题:

  • 互斥性,同一时刻只能有一台服务器能访问资源
  • 安全性,锁只能被持有该锁的客户端删除或者释放
  • 容错,在服务器宕机的时候,锁仍能得到释放或者其他服务器可以进行加锁
  • 避免死锁

方案1

  1. 首先使用setnx命令,即当没有key存在的时候,才会创建value。

    • 当执行成功的时候会返回1

    • 当执行失败的时候会返回0

  2. 使用expire命令,指定key的过期时间

setnx key value
expire key second

image.png

问题:

因为操作不是原子性的,如果在进行setnx的时候,刚好服务器宕机,没有来得及进行expire,那么该key将一直无法释放。

方案2

直接使用redis的原子命令:

set key value [EX seconds] [PX milliseconds] [NX|XX]
  • EX: key在多少秒之后过期
  • PX:key在多少毫秒之后过期
  • NX: 当key不存在的时候,才创建key,效果等同于setnx
  • XX:当key存在的时候,覆盖key

image.png

问题:

当同一时刻有大量的key过期的时候,删除key是需要时间的,可能导致redis出现暂时的卡顿现象,要如何解决?

答:在设置key过期时间的时候加上一个随机值

参考