Redis的分布式锁
在多台服务时不能使用synchronized
,原因是多台服务之间会失效,需要用到Redis的分布式锁。
可以利用Redis的setnx命令来实现分布式的加锁,但无法保证原子性,是因为要在setnx之后在加上锁的过期时间,这是俩条命令,需要放到一条命令中来保证原子性。
Redis本身没有事务,但可以通过一些命令来完成类似于事务的方式,但无法回滚。
推荐使用set lock value NX EX 10
。解读:lock锁的名称,也就是key,value:lock的值(也就是资源),NX标识表示互斥,EX后加过期时间。
加过期时间是为了防止死锁的出现。例如出现:业务超时,服务宕机等情况。
在释放锁是直接DEL key(锁的名字)即可。
Redis的分布式锁如何合理的控制有效时长(问的是redisson的分布式锁)
问题解析:当给分布式锁设置了一个过期时间,但业务执行时间比较长,锁在业务执行时释放了,就无法保证业务执行的原子性了。锁设置的过期时间不能太长也不能太短。
解决方案:
- 根据业务的执行时间进行预估:不推荐
- 给锁续期:实现原理:给锁设置过期时间时,在开一个线程来监控业务的执行,