我用的分布式锁

date
Oct 24, 2018
slug
我用的分布式锁
status
Published
tags
Java
Redis
summary
type
Post

业务场景

智能硬件计时收费系统,系统的核心部分是:数据搜集、费用计算。 关键点,这些设备是按合同出租的,使用任务调度系统,按设定的频率更新并计算费用,每次更新合同相关数据,比如账单时,就涉及到资源并发问题。

分布锁引入

因此我引入了分布式锁,主要考虑到这几个方面:
  • 资源并发,必须使用锁。服务是分布式时部署,所以这个锁需要支持分布式。
  • 首先考虑的是数据库锁,乐观锁和悲观锁。这个场景,冲突的概率比较高,不适合乐观锁。悲观锁是能满足业务要求的,不过我考虑到,减轻数据库开销,所以没选这个。
  • 最后,我选择了redis分布式锁(zk也是可以的)。基本原理就是:给资源一个唯一编码,尝试用Setnx命令在redis中写入“当前时间+过期时长”的时间戳,设置成功了即拿到锁。没设置成功,检查当前锁是否过期,如果没过期,等待一定时间再尝试;如果过期了尝试写入新值(具体细节会更复杂);

个人总结

  • 单节点redis分布式锁不够健壮,如果挂掉,会出现锁丢失,更完备的版本是redis集群实现。
  • 我们的数据库其实还没到瓶颈,选数据库会简单一些。

© XieZhichao 2022 - 2024