使用Go语言实现Redis分布式锁(附有看门狗自动续期机制)
Redis我们日常开发经常使用,而分布式锁的一个重要实现就是通过Redis完成,分布式锁要解决的核心问题是防止对某个资源进行重复或者过度请求,例如我们在分布式系统中创建订单之前,必须获取分布式锁才能创建订单,其要解决的主要问题有两个: 1)如果用户重复点击提交订单按钮,可以通过分布式锁避免重复创建订单 2)商品库存有限,通过分布式锁能够解决超卖问题 Redis实现分布式锁 由于Redis中set nx命令的原子性,只有在键值不存在的时候才能设置值,因此可以通过set nx实现分布式锁,但是它有弊端就是: 如果业务还没有执行完,那么会导致业务没有执行完,锁就被释放了 因此延伸出了基于Redis延伸的Redisson分布式锁框架,它实现的原理在于使用Redis单线程模型执行SET NX命令lua脚本确保获取锁操作原子性,同时它内置了更为丰富的看门狗机制,满足了在业务执行过程中,自动续期锁 Go语言实现分布式锁 上面都是基于理论介绍,接下来就实现基于Redis的分布式锁 明确原子性操作 在实现之前,我们要明确加锁、释放锁与续期锁的机制: 加锁:设置键值与过期时间,通过setnx px实现,如果键值已经存在直接返回错误 释放锁:我们一定要确保释放的锁是自己加的锁,因此要判断value值是否是之前设置的value值,只有判断正确才能够释放锁 续期锁:与释放锁同理,只有当前锁是自己加的锁才续期 完整测试用例: 测试依赖 miniredis 模拟 Redis 服务,请先安装: 测试文件:mutex_test.go 运行测试 -race 标志会启用数据竞争检测,确保并发安全。 注意事项






