Redisson 实现分布式锁

1. 介绍

Redisson 是一个 java 操作 Redis 的客户端。

提供了大量的分布式数据集来简化对 Redis 的操作和使用,可以让开发者像使用本地集合一样使用 Redis,完全感知不到 Redis 的存在。

2. 种引入方式

  1. spring boot starter 引入(不推荐,版本迭代太快,容易冲突) 参考
  2. 直接引入:https://github.com/redisson/redisson#quick-start (推荐)

3. redission的看门狗机制

redisson 中提供的续期机制,开一个监听线程,如果方法还没执行完,就帮你重置 redis 锁的过期时间。

原理:参考

  1. 监听当前线程,默认过期时间是 30 秒,每 10 秒续期一次(补到 30 秒)
  2. 如果线程挂掉(注意 debug 模式也会被它当成服务器宕机),则不会续期

4. 具体实现

这里使用第二种:直接引入的方式

参考:直接引入:参考官网

1. 引入依赖

<!-- https://github.com/redisson/redisson#quick-start -->
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.27.1</version>
</dependency>

2. 添加配置类,注入Bean

  • 这里是使用的单台redis情况,配置从yml配置文件中获取
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissionConfig {

    // redis域名
    private String host;

    // redis端口
    private String port;

    // redis使用库
    private int database;

    // redis使用库
    private String password;

    @Bean
    public RedissonClient redissonClient() {
        // 1. 创建配置
        Config config = new Config();
        String redisAddress = String.format("redis://%s:%s",host,port);
        config.useSingleServer()
                .setAddress(redisAddress)
                .setPassword(password)
                .setDatabase(database);
        // 2. 创建Redisson实例
        // Sync and Async API
        RedissonClient redisson = Redisson.create(config);
        // 3. 返回
        return redisson;
    }
}

3. 使用案例

@Component
@Slf4j
public class CacheJob {

    @Resource
    private RedissonClient redissonClient;

    // 定时任务
    @Scheduled(cron = "0/10 * * * * ?")
    public void doCaCheRecommendUser() {
        // 获取分布式锁
        RLock lock = redissonClient.getLock("haoyue:precachejob:docache:lock");
        try {
            // 保证只有一个线程获取锁
            boolean tryLock = lock.tryLock(0, -1, TimeUnit.SECONDS);
            //System.out.println("getLock: thread:" + Thread.currentThread().getId());
            if (tryLock) {
                // 业务逻辑
                doWork();
            }
        } catch (InterruptedException e) {
            log.error("doWork error", e);
        } finally {
            // 释放自己的锁
            if (lock.isHeldByCurrentThread()) {
                //System.out.println("unLock: thread:" + Thread.currentThread().getId());
                try {
                    lock.unlock();
                } catch (Exception e) {
                    log.error("redis unlock error", e);
                }
            }
        }

    }

    /**
     * 具体的业务逻辑
     */
    private void doWork() {
        // ***
    }
}

相关推荐

  1. Redisson 实现分布式

    2024-03-30 21:02:02       22 阅读
  2. Redisson实现分布式

    2024-03-30 21:02:02       8 阅读
  3. redisson分布式实现方式

    2024-03-30 21:02:02       41 阅读
  4. redisson+aop实现分布式

    2024-03-30 21:02:02       38 阅读
  5. 比较 Redisson 和 Curator:分布式实现

    2024-03-30 21:02:02       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 21:02:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 21:02:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 21:02:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 21:02:02       18 阅读

热门阅读

  1. 浅谈Spring中的JoinPoint MethodSignature Signature

    2024-03-30 21:02:02       16 阅读
  2. Markdown渲染器csp

    2024-03-30 21:02:02       17 阅读
  3. day2链表

    2024-03-30 21:02:02       13 阅读
  4. 每日一题 --- 两数之和[力扣][Go]

    2024-03-30 21:02:02       24 阅读
  5. 解释Python中的可变类型和不可变类型

    2024-03-30 21:02:02       17 阅读
  6. 栈,队列,堆,树

    2024-03-30 21:02:02       18 阅读
  7. 测试开发岗 - 常见面试题(一)

    2024-03-30 21:02:02       19 阅读
  8. nginx 配置mp4文件播放

    2024-03-30 21:02:02       15 阅读