基于Redis实现分布式锁

目录 技术
一个好的分布式锁需要能保证以下几个条件:
  • 互斥性(在任意时刻,只有一个客户端能持有锁)
  • 安全性(加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了)
  • 不会发生死锁(即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁)
  • 容错性(当部分节点宕机客户端仍然能获取锁或释放锁)

正确加锁姿势:
一些老的写法是通过setnx key value和expire配合实现,但是因为是分成两步所以不能保证原子性,所以一旦在setnx后redis宕机了,那expire就不能设置成功,导致死锁。
新写法redis支持set直接设置过期时间,这种方式可以保证原子性。set key value [EX seconds][PX milliseconds][NX|XX],并且满足分布式锁的四个条件。

正确解锁姿势:
先获取锁对应的value值,检查是否与requestId相等,如果相等则删除key(解锁)。redis支持通过eval命令执行Lua脚本,这样能保证原子性,在eval命令执行Lua代码的时候,Lua代码将被当成一个命令去执行,并且直到eval命令执行完成,Redis才会执行其他命令。

暂无评论

发表评论

电子邮件地址不会被公开。