Redis的分布式锁

61 阅读1分钟

一、前言

在分布式高并发场景中,为了保证共享资源的数据正确性,需要使用分布式锁将共享资源锁住,一次给一个线程使用。 下面说一下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的分布式锁,自动给锁续期。