Redisson 分布式锁的简单封装 使调用代码更简洁

Stella981
• 阅读 648

1. 调用分布式锁的时候, 代码有点繁琐, 每次调用都要写这么一套, 如下

RLock lock = redissonClient.getLock("lock-1");
try {
    boolean tryLock = lock.tryLock(1, 5, TimeUnit.SECONDS);
    if(tryLock) {
        System.out.println("******************** Business ********************");
    }
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    if(lock.isHeldByCurrentThread()) {
        lock.unlock();
    }
}

2. 封装一个模板类 RedissonLockTemplate 用来调用锁, 封装一个回调类 TryLockCallback 用来包住执行的业务代码

public interface TryLockCallback<T> {

    T doBusiness();
    
}

public class RedissonLockTemplate {
    private Logger logger = LoggerFactory.getLogger(getClass()); 
    
    private RedissonClient redissonClient;

    public RedissonLockTemplate(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }
    
    public <T> T tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit, TryLockCallback<T> action) {
        RLock lock = redissonClient.getLock(lockKey);
        T result = null;
        try {
            boolean tryLock = lock.tryLock(waitTime, leaseTime, unit);
            if(tryLock) {
                result = action.doBusiness();
            }
        } catch (InterruptedException e) {
            logger.error("{} 锁发生中断异常!", lockKey, e);
        } finally {
            if(lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
        return result;
    }
}

3. 在 SpringBoot 项目中使用

@SpringBootConfiguration
public class RedissonConfig {
    
    @Value("${spring.redis.host}")
    private String redisHost;
    @Value("${spring.redis.port}")
    private String redisPort;
    

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
//        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort);
        return Redisson.create(config);
    }
    
    @Bean
    public RedissonLockTemplate redissonLockTemplate() {
        RedissonLockTemplate redissonLockTemplate = new RedissonLockTemplate(redissonClient());
        return redissonLockTemplate;
    }
}

@Autowired
private RedissonLockTemplate redissonLockTemplate;


@RequestMapping("/test")
@ResponseBody
public Integer test() {
    Integer result = redissonLockTemplate.tryLock("lock-1", 1, 5, TimeUnit.SECONDS, new TryLockCallback<Integer>() {
        @Override
        public Integer doBusiness() {
            // 业务代码写在这里
            System.out.println("************** doBusiness *************");
            return 0;
        }
    });
    return result;
}

大家看, 是不是简洁了很多.....

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java并发相关(四)——关于synchronized的可重入性,线程切换实现原理与是否公平锁
一、可重入性  关于synchronized的可重入性的证明,我们可以通过A类内写两个同步方法syncA(),syncB()。然后syncA内调用syncB,调用syncA发现代码可正常执行,来证明这一点。  当处于无锁阶段时,划掉,都重入了不可能处于无锁。  当处于偏向锁阶段时,由之前对偏向锁的解释可知,偏向当前线程id是,当前线程可直
Stella981 Stella981
2年前
SpringBoot 2.0集成Redisson实现分布式锁(redis
一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的。Redisson(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fredisson%2Fredisson%2Fwiki%2F2.%25E9%25
Stella981 Stella981
2年前
Spring boot 整合 Redisson
1  概述  Redisson实现了分布式和可扩展的Java数据结构,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。2    特点1.Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了
Stella981 Stella981
2年前
Redis分布式锁的正确实现方式
前言分布式锁一般有三种实现方式:1.数据库乐观锁;2.基于Redis的分布式锁;3.基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。
Wesley13 Wesley13
2年前
RPC原理及实现
1简介RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。2调用分类RPC调用分以下两种:同步调用客户方等待调用执行完成并返回结果。
Wesley13 Wesley13
2年前
Java多线程进阶干货(2)
问题1:子类可以调用父类的同步方法吗?/    一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,  再次申请时,仍然会得到该对象的锁,也就是说synchronized获得的锁是可重入的   这里是继承中有可能发生的情形,子类调用父类的同步方法 /public class Test09 {    sy
Stella981 Stella981
2年前
AQS共享锁应用之Semaphore原理
我们调用Semaphore方法时,其实是在间接调用其内部类或AQS方法执行的。Semaphore类结构与ReetrantLock类相似,内部类Sync继承自AQS,然后其子类FairSync和NoFairSync分别实现公平锁和非公平锁的获取锁方法tryAcquireShared(intarg),而释放锁的tryReleaseShared(inta
Stella981 Stella981
2年前
Dubbo是什么?能做什么?
1\.Dubbo是什么?Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用
Stella981 Stella981
2年前
Dubbox
1.Dubbox是一个分布式服务框架,Dubbox致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。!
京东云开发者 京东云开发者
6个月前
线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队
前言之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。背景说明分布式事务消息表:业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案消息表名:mqmessages数据量:3000多万索引:createtime和statuss