基于 go 实现 redis 分布式锁


业务分析

关键问题

问题 方案
如果业务挂掉未能释放锁 给锁加上过期时间
如何为特定的资源生成锁,如何保证锁的唯一性 使用 uuid 作为键值,全局共享一个 uuid 生成器(或一个集群)
如果业务未能结束就释放了锁 看门狗机制
单个 redis 示例挂掉了 进行集群化部署,基于红锁算法去取锁,这个在业务上实现
如何保证操作的原子性 手动制作回溯,以防对非原子操作的部分成功。
对于部分需要时间判断才能成功的条件? 使用自旋锁
对于部分需要同时读的锁 使用可重入锁
锁的粒度问题 细份粒度为:读锁,写锁,读写锁
大数据竞争读写锁 锁分段,这个在业务上实现,不在包中取做。

次要问题

问题 方案
减少对分布式锁的冲突访问 本地也用 mutex 做一次锁,这个在业务上取实现,不直接包含到本代码中
失败返回数据应该放什么 返回当前任务的uuid
如何手工排障碍 写一个 强制释放的函数
如果我本地有特殊需求需要再锁定一段时间这个分布式锁 手动续期函数

看门狗机制

功能:预防业务工作的过程中锁到期释放

原理:在业务执行过程中开一个协程,用于不断延迟锁的过期时间

流程:

  • 加锁成功,启动看门狗
  • 看门狗线程不断延长锁的过程时间
  • 解锁,关闭看门狗

代码

https://github.com/zouxingyuks/GoLockRedis

参考资料


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


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