redis实现分布式锁,最简单的就是用 set key value ex seconds nx (只有键不存在的时候才会设置key,并且设置过期时间)。

但是一旦需要比较复杂的场景,比如要实现可重入锁,就需要多个redis语句了,这个时候为了实现原子性,那就必须要用到lua脚本,原理就是,维护一个计数器,默认是0,当锁存在的时候就加一,当解锁的时候,计数器等于0的时候就删除该key。

当然这些不需要我们自己造轮子,redisson已经帮我们实现好了,原理也是一样的。用起来也非常的简单。

完整代码:https://gitee.com/lzh1995/redis-lock-demo

依赖

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson-spring-boot-starter</artifactId>
  4. <version>3.13.6</version>
  5. </dependency>

配置文件

  1. spring:
  2. application:
  3. name: ms-seckill # 应用名
  4. # Redis
  5. redis:
  6. port: 6379
  7. host: 127.0.0.1
  8. timeout: 3000
  9. # password: 123456

代码实现

  1. @Resource
  2. private RedissonClient redissonClient;
  3. // Redisson 分布式锁
  4. // 设置锁定资源名称
  5. RLock lock = redissonClient.getLock(lockName);
  6. try {
  7. // Redisson 分布式锁处理
  8. boolean isLocked = lock.tryLock(expireTime, TimeUnit.MILLISECONDS);
  9. if (isLocked) {
  10. // 执行业务逻辑操作
  11. }
  12. }catch (Exception e) {
  13. } finally {
  14. // 无论如何, 最后都要解锁
  15. lock.unlock();
  16. }