现在很多码农都有接触到Redis,接下来就跟大家介绍一下redis实现分布锁的小方法。
使用 set 命令设置锁标记,必须有超时时间,以便客户端崩溃,也可以释放锁;对于不需要超时时间的,需要自己实现一个能不断刷新锁超时时间的线程。如果占用setnx的线程异常一直不释放锁,导致后续用户无法执行逻辑,setnx命令超时时间,并且在finally中释放setnx锁。
Redis,它里面提供了SETNX命令可以实现锁的排他性,当key不存在就返回1,存在就返回0。然后还可以用expire命令设置锁的失效时间,从而避免死锁问题。
当然有可能存在锁过期了,但是业务逻辑还没执行完的情况。Redisson这个开源组件,就提供了分布式锁的封装实现,并且也内置了一个Watch Dog机制来对key做续期。
如果是0,就把锁的变量值设置为1,表示获取到锁,如果不是0,就返回错误信息,表示加锁失败,已经有别的线程获取到锁了。其实,我们既可以基于单个Redis节点来实现,也可以使用多个Redis节点实现。在这两种情况下,锁的可靠性是不一样的。
基于Zookeeper,Zookeeper中的数据是存在内存的,所以相对于Mysql性能上是适合实际环境的,并且基于Zookeeper的顺序节点、临时节点、Watch机制能⾮常好的来实现的分布式锁。
Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中包含各种分布式锁的实现。
领取专属 10元无门槛券
私享最新 技术干货