iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >springcloud怎么用Redlock实现分布式锁
  • 621
分享到

springcloud怎么用Redlock实现分布式锁

2023-06-25 14:06:25 621人浏览 泡泡鱼
摘要

这篇文章主要讲解了“SpringCloud怎么用Redlock实现分布式锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud怎么用Redlock实现分布式锁”吧!一、red

这篇文章主要讲解了“SpringCloud怎么用Redlock实现分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud怎么用Redlock实现分布式锁”吧!

一、redlock简介

在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。实现高效的分布式锁有三个属性需要考虑:

安全属性:互斥,不管什么时候,只有一个客户端持有锁
效率属性A:不会死锁
效率属性B:容错,只要大多数redis节点能够正常工作,客户端端都能获取和释放锁。
Redlock是Redis官方提出的实现分布式锁管理器的算法。这个算法会比一般的普通方法更加安全可靠。关于这个算法的讨论可以看下官方文档。

二、怎么用java使用 redlock

在pom文件引入redis和redisson依赖:

<!-- redis-->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-redis</artifactId>  </dependency>  <!-- redisson-->  <dependency>   <groupId>org.redisson</groupId>   <artifactId>redisson</artifactId>   <version>3.3.2</version>  </dependency>

AquiredLockWorker接口类,,主要是用于获取锁后需要处理的逻辑:

public interface AquiredLockWorker<T> {     T invokeAfterLockAquire() throws Exception;}

DistributedLocker 获取锁管理类:

public interface DistributedLocker {          <T> T lock(String resourceName, AquiredLockWorker<T> worker) throws UnableToAquireLockException, Exception;     <T> T lock(String resourceName, AquiredLockWorker<T> worker, int lockTime) throws UnableToAquireLockException, Exception;}

UnableToAquireLockException ,不能获取锁的异常类:

public class UnableToAquireLockException extends RuntimeException {    public UnableToAquireLockException() {    }    public UnableToAquireLockException(String message) {        super(message);    }    public UnableToAquireLockException(String message, Throwable cause) {        super(message, cause);    }}

 RedissonConnector 连接类:

@Componentpublic class RedissonConnector {    RedissonClient redisson;    @PostConstruct    public void init(){        redisson = Redisson.create();    }    public RedissonClient getClient(){        return redisson;    }}

RedisLocker 类,实现了DistributedLocker:

import org.redisson.api.RLock;import org.redisson.api.RedissonClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Componentpublic class RedisLocker  implements DistributedLocker{    private final static String LOCKER_PREFIX = "lock:";    @Autowired    RedissonConnector redissonConnector;    @Override    public <T> T lock(String resourceName, AquiredLockWorker<T> worker) throws InterruptedException, UnableToAquireLockException, Exception {        return lock(resourceName, worker, 100);    }    @Override    public <T> T lock(String resourceName, AquiredLockWorker<T> worker, int lockTime) throws UnableToAquireLockException, Exception {        RedissonClient redisson= redissonConnector.getClient();        RLock lock = redisson.getLock(LOCKER_PREFIX + resourceName);      // Wait for 100 seconds seconds and automatically unlock it after lockTime seconds        boolean success = lock.tryLock(100, lockTime, TimeUnit.SECONDS);        if (success) {            try {                return worker.invokeAfterLockAquire();            } finally {                lock.unlock();            }        }        throw new UnableToAquireLockException();    }}

测试类:

  @Autowired    RedisLocker distributedLocker;    @RequestMapping(value = "/redlock")    public String testRedlock() throws Exception{        CountDownLatch startSignal = new CountDownLatch(1);        CountDownLatch doneSignal = new CountDownLatch(5);        for (int i = 0; i < 5; ++i) { // create and start threads            new Thread(new Worker(startSignal, doneSignal)).start();        }        startSignal.countDown(); // let all threads proceed        doneSignal.await();        System.out.println("All processors done. Shutdown connection");        return "redlock";    }     class Worker implements Runnable {        private final CountDownLatch startSignal;        private final CountDownLatch doneSignal;        Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {            this.startSignal = startSignal;            this.doneSignal = doneSignal;        }        public void run() {            try {                startSignal.await();                distributedLocker.lock("test",new AquiredLockWorker<Object>() {                    @Override                    public Object invokeAfterLockAquire() {                        doTask();                        return null;                    }                });            }catch (Exception e){            }        }        void doTask() {            System.out.println(Thread.currentThread().getName() + " start");            Random random = new Random();            int _int = random.nextInt(200);            System.out.println(Thread.currentThread().getName() + " sleep " + _int + "millis");            try {                Thread.sleep(_int);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + " end");            doneSignal.countDown();        }    }

运行测试类:

Thread-48 start
Thread-48 sleep 99millis
Thread-48 end
Thread-49 start
Thread-49 sleep 118millis
Thread-49 end
Thread-52 start
Thread-52 sleep 141millis
Thread-52 end
Thread-50 start
Thread-50 sleep 28millis
Thread-50 end
Thread-51 start
Thread-51 sleep 145millis
Thread-51 end

从运行结果上看,在异步任务的情况下,确实是获取锁之后才能运行线程。不管怎么样,这是redis官方推荐的一种方案,可靠性比较高。

感谢各位的阅读,以上就是“sprinGCloud怎么用Redlock实现分布式锁”的内容了,经过本文的学习后,相信大家对springcloud怎么用Redlock实现分布式锁这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: springcloud怎么用Redlock实现分布式锁

本文链接: https://www.lsjlt.com/news/305287.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springcloud怎么用Redlock实现分布式锁
    这篇文章主要讲解了“springcloud怎么用Redlock实现分布式锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud怎么用Redlock实现分布式锁”吧!一、red...
    99+
    2023-06-25
  • springcloud如何用Redlock实现分布式锁
    目录一、redlock简介 二、怎么用java使用 redlock 三、参考资料 之前写过一篇文章《如何在springcloud分布式系统中实现分布式锁? 》,由于自己仅仅是阅读了相...
    99+
    2024-04-02
  • Redis中怎么利用Redlock实现分布式锁
    Redis中怎么利用Redlock实现分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道se...
    99+
    2023-06-20
  • Redis分布式锁Redlock的实现
    目录普通实现Redlock实现Redlock源码用法唯一ID获取锁释放锁普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value p...
    99+
    2024-04-02
  • 怎么在springcloud分布式系统中实现分布式锁
    本篇内容介绍了“怎么在springcloud分布式系统中实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介一般来说,对数据进...
    99+
    2023-06-25
  • 如何进行Redlock中Redis分布式锁的实现
    这篇文章将为大家详细讲解有关如何进行Redlock中Redis分布式锁的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,...
    99+
    2023-06-02
  • SpringCloud 分布式锁的多种实现
    目录前言1. 分布式锁概述2. 基于数据库的分布式锁2.1 数据库悲观锁实现的分布式锁2.2 数据库乐观锁实现的分布式锁3.基于Redis实现的分布式锁3.1 setnx + exp...
    99+
    2024-04-02
  • Redis中分布式锁Redlock的示例分析
    这篇文章主要介绍了Redis中分布式锁Redlock的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Redlock实现库Java Redisson Star 9458...
    99+
    2023-06-16
  • 详解如何在springcloud分布式系统中实现分布式锁
    目录一、简介 二、redis命令介绍 三、实现思路 四、编码实现 五、注意点 六、参考资料 最近在看分布式锁的资料,看了 Josial L的《Redis in Action》的分布式...
    99+
    2024-04-02
  • 怎么用Redis实现分布式锁
    本文小编为大家详细介绍“怎么用Redis实现分布式锁”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Redis实现分布式锁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单机...
    99+
    2024-04-02
  • 分布式锁的原理及Redis怎么实现分布式锁
    这篇文章主要介绍“分布式锁的原理及Redis怎么实现分布式锁”,在日常操作中,相信很多人在分布式锁的原理及Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-02
    redis
  • Redis分布式锁怎么实现
    这篇文章给大家分享的是有关Redis分布式锁怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分布式锁一般有三种实现方式:1、数据库乐观锁;2、基于Redis的分布式锁;3、...
    99+
    2024-04-02
  • Redis怎么实现分布式锁
    这篇文章主要介绍“Redis怎么实现分布式锁”,在日常操作中,相信很多人在Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis怎么实现分布式锁”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • 怎么用Go+Redis实现分布式锁
    这篇文章主要介绍怎么用Go+Redis实现分布式锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!为什么需要分布式锁用户下单锁住 uid,防止重复下单。库存扣减锁住库存,防止超卖。余额扣减锁住账户,防止并发操作。分布式...
    99+
    2023-06-22
  • 怎么用springboot+zookeeper实现分布式锁
    本篇内容主要讲解“怎么用springboot+zookeeper实现分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用springboot+zookeeper实现分布式锁”吧!Inte...
    99+
    2023-06-29
  • Redis怎么样实现分布式锁
    这篇文章主要介绍了Redis怎么样实现分布式锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在一个分布式系统中,会遇到一些需要对多个节点共享的资源加锁的情况,这个时候需要用到...
    99+
    2023-06-21
  • spring redis分布式锁怎么实现
    在Spring中实现Redis分布式锁可以使用RedisTemplate来操作Redis进行加锁和解锁。 首先,我们需要定义一个分布...
    99+
    2023-10-27
    spring redis
  • Redis中怎么实现分布式锁
    本篇内容介绍了“Redis中怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要分布式...
    99+
    2024-04-02
  • mysql中怎么实现分布式锁
    这篇文章主要介绍“mysql中怎么实现分布式锁”,在日常操作中,相信很多人在mysql中怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中怎么实现分布式锁”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-27
  • java怎么使用redis实现分布式锁
    在Java中使用Redis实现分布式锁可以通过以下步骤:1. 引入Redis相关的依赖,例如Jedis或Lettuce。2. 创建一...
    99+
    2023-10-09
    java redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作