广告
返回顶部
首页 > 资讯 > 精选 >如何使用自定义注解实现redisson分布式锁
  • 825
分享到

如何使用自定义注解实现redisson分布式锁

2023-06-29 05:06:09 825人浏览 独家记忆
摘要

这篇文章主要讲解了“如何使用自定义注解实现redisson分布式锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用自定义注解实现Redisson分布式锁”吧!自定义注解实现rediss

这篇文章主要讲解了“如何使用自定义注解实现redisson分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用自定义注解实现Redisson分布式锁”吧!

自定义注解实现redisson分布式锁

自定义注解

package com.example.demo.annotation;import java.lang.annotation.*;@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface Lock {        String key();        long keepMills() default 20;        long maxSleepMills() default 30;}

aop解析注解

package com.example.demo.utils;import com.example.demo.annotation.Lock;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.reflect.MethodSignature;import org.redisson.api.RLock;import org.redisson.api.RedissonClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.DefaultParameterNameDiscoverer;import org.springframework.expression.EvaluationContext;import org.springframework.expression.spel.standard.SpelExpressionParser;import org.springframework.expression.spel.support.StandardEvaluationContext;import org.springframework.stereotype.Component;import java.util.Objects;import java.util.concurrent.TimeUnit;@Aspect@Componentpublic class LockAspect {    @Autowired    private RedissonClient redissonClient;        private final SpelExpressionParser spelExpressionParser = new SpelExpressionParser();        private final DefaultParameterNameDiscoverer defaultParameterNameDiscoverer = new DefaultParameterNameDiscoverer();    @Around("@annotation(com.example.demo.annotation.Lock)")    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        Object object = null;        RLock lock = null;        try {            // 获取注解实体信息            Lock lockEntity = (((MethodSignature) proceedingJoinPoint.getSignature()).getMethod())                    .getAnnotation(Lock.class);            // 根据名字获取锁实例            lock = redissonClient.getLock(geTKEyBySpeL(lockEntity.key(), proceedingJoinPoint));            if (Objects.nonNull(lock)) {                if (lock.tryLock(lockEntity.maxSleepMills(), lockEntity.keepMills(), TimeUnit.SECONDS)) {                    object = proceedingJoinPoint.proceed();                } else {                    throw new RuntimeException();                }            }        } finally {            if (Objects.nonNull(lock) && lock.isHeldByCurrentThread()) {                lock.unlock();            }        }        return object;    }        public String getKeyBySpeL(String spel, ProceedingJoinPoint proceedingJoinPoint) {        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();        String[] paramNames = defaultParameterNameDiscoverer.getParameterNames(methodSignature.getMethod());        EvaluationContext context = new StandardEvaluationContext();        Object[] args = proceedingJoinPoint.getArgs();        for (int i = 0; i < args.length; i++) {            context.setVariable(paramNames[i], args[i]);        }        return String.valueOf(spelExpressionParser.parseExpression(spel).getValue(context));    }}

service中使用注解加锁使用

@Servicepublic class LockService {  @Lock(key = "#user.id", keepMills = 10, maxSleepMills = 15)    public String lock(User user) {        System.out.println("持锁");        return "";    }}

redisson分布式锁应用

分布式架构一定会用到分布式锁。目前公司使用的基于redis的redisson分布式锁。

应用场景

订单修改操作,首先要获取该订单的分布式锁,能取到才能去操作。lockey可以是订单的主键id。

库存操作,也要按照客户+仓库+sku维护锁定该库存,进行操作。

代码:

Redisson管理类

public class RedissonManager {    private static RedissonClient redisson;    static {        Config config = new Config();        config.useSentinelServers()                .addSentinelAddress("redis://127.0.0.1:26379","redis://127.0.0.1:7301", "redis://127.0.0.1:7302")                .setMasterName("mymaster")                .setReadMode(ReadMode.SLAVE)                .setTimeout(10000).setDatabase(0).setPassword("123***");        redisson = Redisson.create(config);    }         public static RedissonClient getRedisson(){ return redisson;}}

分布式锁

import org.redisson.api.RLock;import org.redisson.api.RedissonClient;import java.util.concurrent.TimeUnit;public class DistributedLock {    private static RedissonClient redissonClient = RedissonManager.getRedisson();    public static boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {        RLock lock = redissonClient.getLock(lockKey);        try {            return lock.tryLock(waitTime, leaseTime, unit);        } catch (InterruptedException e) {            return false;        }    }    public static void unlock(String lockKey) {        RLock lock = redissonClient.getLock(lockKey);        lock.unlock();    }}

测试

public class RedissonTest {    public static void main(String[] args) throws Exception{        Thread.sleep(2000L);        for (int i = 0; i < 3; i++) {            new Thread(() -> {                try {                    //tryLock,第三个参数是等待时间,5秒内获取不到锁,则直接返回。 第四个参数 30是30秒后强制释放                    boolean hasLock = DistributedLock.tryLock("lockKey", TimeUnit.SECONDS,5,30);                    //获得分布式锁                    if(hasLock){                        System.out.println("idea1: " + Thread.currentThread().getName() + "获得了锁");                                                                   Thread.sleep(10000L);                        DistributedLock.unlock("lockKey");                    } else {                        System.out.println("idea1: " + Thread.currentThread().getName() + "无法获取锁");                    }                } catch (Exception e) {                    e.printStackTrace();                }             }) .start();        }    }}

我们再打开一个idea,可以把代码复制一份。同事启动两个RedissonTest ,模拟了并发操作。

测试结果:

idea2: Thread-1获得了锁
idea2: Thread-0无法获取锁
idea2: Thread-2无法获取锁
 
 
idea1: Thread-2无法获取锁
idea1: Thread-0无法获取锁
idea1: Thread-1无法获取锁

从测试结果发现,最后是只能有一个idea的一个线程能获取到锁。

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

--结束END--

本文标题: 如何使用自定义注解实现redisson分布式锁

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

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

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

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

下载Word文档
猜你喜欢
  • 使用自定义注解实现redisson分布式锁
    目录自定义注解实现redisson分布式锁自定义注解aop解析注解service中使用注解加锁使用redisson分布式锁应用应用场景Redisson管理类分布式锁测试类自定义注解实...
    99+
    2022-11-13
  • 如何使用自定义注解实现redisson分布式锁
    这篇文章主要讲解了“如何使用自定义注解实现redisson分布式锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用自定义注解实现redisson分布式锁”吧!自定义注解实现rediss...
    99+
    2023-06-29
  • 自定义注解+Spel实现分布式锁方式
    目录自定义注解+Spel实现分布式锁依赖RedisLockRegistryConfig自定义注解自定义切面测试类执行结果基于注解的方式实现分布式锁redis分布式锁的实现测试自定义注...
    99+
    2022-11-13
  • Redisson如何实现分布式锁、锁续约
    这篇文章主要介绍了Redisson如何实现分布式锁、锁续约的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redisson如何实现分布式锁、锁续约文章都会有所收获,下面我们一起来看看吧。一、基础0)Redisso...
    99+
    2023-07-05
  • SpringBoot整合Redisson如何实现分布式锁
    这篇文章将为大家详细讲解有关SpringBoot整合Redisson如何实现分布式锁,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redisson是架设在redis基础上的一个Java驻内存数据网格(In...
    99+
    2023-06-25
  • Redisson分布式闭锁RCountDownLatch如何使用
    这篇文章主要介绍了Redisson分布式闭锁RCountDownLatch如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redisson分布式闭锁RCountDownLatch如何使用文章都会有所收获,...
    99+
    2023-07-05
  • Springboot中如何使用Redisson实现分布式锁浅析
    目录前言1. 概述2. Redisson 在 Springboot 中的使用2.1 引入依赖2.2 在 Springboot 配置中配置Redis2.3 Demo代码3. 综述前言 ...
    99+
    2022-11-12
  • 如何正确的使用redisson分布式锁
    这期内容当中小编将会给大家带来有关如何正确的使用redisson分布式锁,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Redisson是Redis官方推荐的Java版的Redis客户端。它提供的功能非常多...
    99+
    2023-06-14
  • 如何使用注解方式实现 Redis 分布式锁
    目录引入 Redisson初始化 Redisson编写 Redisson 分布式锁工具类声明注解 @Lock注解解析类引入 Redisson <dependency> <groupId>org...
    99+
    2022-07-22
    注解方式实现 Redis 分布式锁 Redis 分布式锁
  • 如何使用注解方式实现 Redis 分布式锁
    目录引入 Redisson初始化 Redisson编写 Redisson 分布式锁工具类声明注解 @Lock注解解析类引入 Redisson <dependency> ...
    99+
    2022-11-13
  • Java-Redis-Redisson分布式锁的功能使用及实现
    目录前置基础设施功能使用和介绍其他悲观锁的实现方式前置 Java-Redis-Redisson配置基础上我们进行了改造,让锁的使用更加方便 基础设施 RedissonLock imp...
    99+
    2022-11-13
    Java Redis Redisson分布式锁 Java  Redisson分布式锁
  • Springboot基于Redisson如何实现Redis分布式可重入锁源码解析
    这篇文章主要介绍了Springboot基于Redisson如何实现Redis分布式可重入锁源码解析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言我们在实现使用Redi...
    99+
    2023-06-29
  • SpringBoot利用注解来实现Redis分布式锁
    目录一、业务背景二、分析流程加锁超时问题解决方案:增加一个「续时」三、设计方案四、实操相关属性类配置核心切面拦截的操作五、开始测试六、总结一、业务背景 有些业务请求,属于耗时操作,需...
    99+
    2022-11-13
  • 使用Spring AOP 如何实现自定义注解
    这期内容当中小编将会给大家带来有关使用Spring AOP 如何实现自定义注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Maven中加入以下以依赖:<!-- Spring AOP + Aspe...
    99+
    2023-05-31
    springaop 注解
  • 使用Redis如何实现分布式锁
    这篇文章主要介绍了使用Redis如何实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇使用Redis如何实现分布式锁文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-10-19
  • 如何使用Redis实现分布式锁
    这篇文章将为大家详细讲解有关如何使用Redis实现分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。加锁部分解锁部分主要原理是使用了 redis 的 s...
    99+
    2022-10-18
  • 详解redis如何实现分布式锁
    小编这次要给大家分享的是详解redis如何实现分布式锁,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。前言系统的不断扩大,分布式锁是最基本的保障。与单机的多线程不一样的...
    99+
    2022-10-18
  • Redis如何实现分布式锁详解
    目录一、前言二、实现原理2.1 加锁2.2 解锁三、通过RedisTemplate实现分布式锁四、通过Redisson实现一、前言 在Java的并发编程中,我们通过锁,来避免由于竞争...
    99+
    2022-11-12
  • 使用Spring自定义实现IOC和依赖注入(注解方式)
    目录大致思路:注解实现方式:xml实现方式:1. 引入相关jar2. 定义注解类ExtService是注解类的, ExtResource是注解属性的3.定义一个借口4. 接口和使用注...
    99+
    2022-11-12
  • 详解Java如何实现自定义注解
    目录概念作用JDK中预定义的一些注解注解生成文档案例自定义注解格式本质属性:接口中的抽象方法元注解:用于描述注解的注解在程序使用(解析)注解:获取注解中定义的属性值案例:通过自定义注...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作