分布式锁需要注意什么问题


写在前面

在分布式系统中,实现分布式锁是一项常见的需求。为了追求性能,通常使用Redis使用分布式锁,但是想要实现高性能并且数据安全的分布式锁,并非易事,先看一下分布式锁要满足哪些特性。

需要注意的问题

  • 互斥,一个线程获取到锁,其他线程只能等待。
  • 高性能,比如MySQL基于磁盘操作实现,性能较差。
  • 加锁操作是原子的
  • 释放锁操作是原子的
  • 避免释放锁失败
  • 避免提前释放锁,比如释放锁操作加在事务里面,就会出现事务提交前,已经释放锁。
  • 加锁操作支持阻塞,避免其他线程不断轮询,浪费CPU。
  • 支持设置锁过期时间,防止释放锁失败,作为兜底策略。
  • 支持断开客户端连接后,自动释放锁(例如zookeeper临时节点)。
  • 释放锁的时候判断是否属于当前线程,避免释放了其他线程的锁。
  • 支持锁可重入,避免当前线程多次加锁的时候,出现死锁。
  • 支持锁自动续期,如果已经给锁设置了过期时间,可能会出现业务还没执行完成,锁已经过期。

业务代码没有执行完,锁超时了怎么办

上面说过,为了防止锁没有释放,需要设置一个超时时间。但是如果业务代码确实在某次执行时间过长,超过了锁的最长时间怎么办?

redis提供了一个看门狗机制。看门狗机制就是redis内部维持一个一个定时器,定时去更新锁过期时间。

这个时候锁超时时间不需要设置了,因为设置了也没有意义。

可以设置看门狗的最长时间,过了这个时间业务还没执行完就释放锁。一般默认值是30s。

参考

[1] 高并发必备,使用Redis分布式锁必须注意的10个细节



文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录