redis实现分布式锁,最简单的就是用 set key value ex seconds nx (只有键不存在的时候才会设置key,并且设置过期时间)。
但是一旦需要比较复杂的场景,比如要实现可重入锁,就需要多个redis语句了,这个时候为了实现原子性,那就必须要用到lua脚本,原理就是,维护一个计数器,默认是0,当锁存在的时候就加一,当解锁的时候,计数器等于0的时候就删除该key。
当然这些不需要我们自己造轮子,redisson已经帮我们实现好了,原理也是一样的。用起来也非常的简单。
完整代码:https://gitee.com/lzh1995/redis-lock-demo
依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.6</version>
</dependency>
配置文件
spring:
application:
name: ms-seckill # 应用名
# Redis
redis:
port: 6379
host: 127.0.0.1
timeout: 3000
# password: 123456
代码实现
@Resource
private RedissonClient redissonClient;
// Redisson 分布式锁
// 设置锁定资源名称
RLock lock = redissonClient.getLock(lockName);
try {
// Redisson 分布式锁处理
boolean isLocked = lock.tryLock(expireTime, TimeUnit.MILLISECONDS);
if (isLocked) {
// 执行业务逻辑操作
}
}catch (Exception e) {
} finally {
// 无论如何, 最后都要解锁
lock.unlock();
}