一、前言
在分布式高并发场景中,为了保证共享资源的数据正确性,需要使用分布式锁将共享资源锁住,一次给一个线程使用。 下面说一下redis的分布式锁。
二、使用redis分布式锁
Redis实现分布式锁主要利用Redis的setnx命令。setnx是Set if not exists(如果不存在,则SET)的简写。
- 添加锁
#添加锁,NX是互斥,EX是设置超时时间
SET lock value NX EX 10
- 释放锁
#释放锁,删除即可
DEL lock
为什么不使用命令setnx(key, value); 然后设置过期时间expire(key, time);呢?
因为两条命令是无法保证操作的原子性的。所以要放到一条命令中执行。
如果不设置过期时间呢?
如果获取到锁之后,发生了服务器实例宕机的情况,就会导致锁一直不被释放,其他线程永远获取不到锁,发生死锁的情况。
如果不使用try-finally处理异常会出现什么情况?
如果在加锁之后,释放锁之前,代码运行出现了异常情况,就会导致服务无法释放锁,发生死锁。添加try-finally代码块,在finally中释放锁。这样无论代码正常与否,都可以释放锁。
如果发生业务超时,如何合理控制锁的有效时长呢? 可以使用Redisson的分布式锁,自动给锁续期。