Redis 入门七:分布式锁
主要内容:
本篇主要介绍分分布式锁,以及一些注意事项
分布式锁:
为什么要有分布式锁呢?
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!
如何操作:
redis 加锁:setnx key,加了锁之后,不能再对其进行操作,释放后,别人才可以对其进行操作
释放锁:del key
设置锁的过期时间:expire
小贴士:如果加上锁之后出现了故障,那就一直锁在那了,过期时间也无法设置了,怎么办?
我们在设置锁的时候直接也在后面设置过期时间:set key 10 nx ex 12
可能出现的问题:
A 服务器卡顿了,操作时间比过期时间还长,锁被释放了,这个时候 B 抢住了,正好 A 服务器反应过来了,接着进行操作,完成操作之后,就把 B 的锁给释放了。释放了被人的锁怎么能行呢。
解决方案:
加上 uuid 标识,释放时先判断当前的 uuid 和要释放的 uuid 是否一样。
但是即时有了 uuid 来进行判别,还是会出现释放别人锁的情况:因为缺原子性。
举个例子:a 操作上锁,操作,释放,在释放的时候会判断 uuid,判断结果是一样的,然后他又接着进行删除操作,正要删除时,过期时间到了,锁被自动释放了,然后被 b 给抢走了,b 进行上锁,操作,这时 a 删除操作完成了,就要释放锁,这时释放的就是 b 上的锁了。
版权声明: 本文为 InfoQ 作者【打工人!】的原创文章。
原文链接:【http://xie.infoq.cn/article/556789c79f109d4804ea3589f】。文章转载请联系作者。
评论