Redisson分布式锁----使用实例(一)

本文环境搭建:Springoot + Redisson 3.12.3 + Maven 3.6.1 +lombok

1、业务需求分析

 

项目部署在多个服务器,当我们有业务需要在每天凌晨,拉取数据写入数据库的时候,所有服务器上的定时器都在凌晨一起运行,数据库负荷太大,这时候如何解决呢?当多线程处理业务,因为线程不安全,导致数据紊乱,如何解决呢?Redis的分布式锁就能处理这些场景,这篇文章主要介绍的是redisson分布式锁的使用实例。

 

2、redis分布式锁基本特性

互斥性:这是最基本的特性,保证多个线程进入的情况下,只有一个线程可以获取到锁。

容错率:可以用unlock自己解锁,而且解铃还须系铃人,哪个线程上的锁,就由谁来解锁。

唯一性:redis分布式锁第一个参数和第二个参数会保证其唯一性,我在业务中第二个参数用的是uuid。

防止死锁:给获取锁的线程一个过期时间,保证业务处理出现异常,时间过期后,锁也能正常释放。

Redisson是一个高级的分布式协调Redis客户端,在项目中直接引入redisson的maven包,使用分布式锁会事半功倍。

 

注意事项,redisson使用trylock上锁的时候,最好带参数,否则在unlock释放所得时候,若当前线程没有获取锁,会报错,即使用locked先判断一下也不行,因为locked底层源码是任意线程上锁都会返回true。

 

纸上得来终觉浅,绝知此事要躬行,话不多说,直接撸代码。

 

3、实例代码:

 

先导入需要的maven包,在写一个redisson装入bean容器,方便后面依赖注入,例子中lock和trylock实例全部都有,若没有开启分布式锁,则线程不安全,会导致数据紊乱,甚至多消费,开启之后,消费正常。

  <!-- 分布式锁 Redisson -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.12.3</version>
        </dependency>

 

 @Resource
    private RedissonClient redissonClient;
    private static int a = 50;

    @RequestMapping("/redis_test")
    public String redisTest() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 100; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    RLock rLock = redissonClient.getLock("zhangsan");
                    //rLock.lock();
                    log.info("获取锁成功!");
                    try {
                        //业务逻辑,存储入DB
                        //加锁,最多等待10s,10s之后自动释放锁
                        if (rLock.tryLock(10, 10, TimeUnit.SECONDS)) {
                            Thread.sleep(50);
                            if (a > 0) {
                                a--;
                            }
                        }
                    } catch (Exception e) {

                    } finally {
                        //释放锁
                        if (rLock.isLocked()) {
                            rLock.unlock();
                        }
                    }
                    log.info("最后剩余:" + a);
                }
            });
        }
        executorService.shutdown();

        return "success";
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值