基于 go 实现 redis 分布式锁


业务分析

关键问题

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

次要问题

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

看门狗机制

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

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

流程:

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

代码

https://github.com/zouxingyuks/GoLockRedis

参考资料


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


评论
  目录