说下对分布式锁的个人理解
只要是多进程分布式的服务架构,涉及到交易,不管是什么系统,肯定会用到分布式锁,最典型的就是电商业务中的扣库存,保证同一时间只能有一个线程在修改我们的库存数据,否则数据就乱了。
相对于传统的单体架构,一台服务器一个JVM,可以用JVM里面的一个内部锁,像我们熟悉的synchronized、ReentrantLock都可以搞定,而对于多台服务器,分布式架构、集群架构,单单jvm锁,是保证不了数据库里的数据正常扣减的。所以这时候呢,就需要引入分布式锁
分布锁实现的方式有三种,典型的就是基于数据库,基于zookeeper,基于redis实现分布式锁。我在刚毕业的时候呢,差不多17年的时候,就实现了一个交易的功能,那时候用redis的不多,就是用数据库来实现的这个分布式锁,也很容易实现,那时候感觉性能也还行,可能流量也不是很大吧,现在肯定是没人用了,哈哈。都不知道丢到哪里去了代码。。
因此现在大部分人,还是会选择redis来实现分布式锁,redis命令也很简单,set key value setnx这些,为了解决一些特殊情况,比如说业务代码的bug导致锁解锁失败,这时候就麻烦了,所有需要加锁的线程会全部阻塞,这就是常说的死锁的情况,为了防止死锁就必须给它加一个过期时间。
虽然死锁的问题解决了,但是带来了一个新的问题,就是万一这个时间到了,我们业务逻辑还没处理完怎么办?这个问题呢,也很好解决,用一个守护线程来‘续命’,常说的就是watchdog看门狗,我们需要额外的起一个线程去定期检查,如果还没有处理完,我们就相应的把这个key的过期时间延长,当然还会产生其他很多问题啊,在各个业务场景下,有精力有实力的可以去自己去实现,像我喜欢走捷径的直接去集成分布式锁的轮子,比如像redisson很多功能都实现了,包括看门狗、红锁等等,大家可以去试一试。(完)
ps: 如果有任何疑问,欢迎评论区给我留言
注意:本文归作者所有,未经作者允许,不得转载