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 # 应用名# Redisredis:port: 6379host: 127.0.0.1timeout: 3000# password: 123456
代码实现
@Resourceprivate 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();}
