java中redissonClient 分布式锁的使用

 更新时间:2024年03月03日 10:54:05   作者:努力提升的菜鸟程序员  
在集群的情况下,用户多次请求接口时,存入的内容可能会导致重复,这时候就可以使用分布式锁来限制,本文就来介绍一下java中redissonClient 分布式锁的使用,感兴趣的可以了解一下

在集群的情况下,用户多次请求接口时,存入的内容可能会导致重复,这时候就可以使用分布式锁来限制

适用场景

分布式应用,分布式缓存,分布式回话管理,分布式服务(任务,延迟任务,执行器),分布式redis客户端

第一步:导入依赖

<!-- redis 分布式锁框架 -->
		<dependency>
			<groupId>org.redisson</groupId>
			<artifactId>redisson</artifactId>
			<version>3.12.5</version>
		</dependency>

第二步:配置连接redis

程序化配置方法

Config config = new Config();
//存放在哪个服务器的redisIP地址加redis端口号
config. useSingleServer().setAddress("127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);

验证是否连接成功

redisson.getConfig().toJSON().toString()

结果

{"singleServerConfig":{"idleConnectionTimeout":10000,"pingTimeout":1000,"connectTimeout":10000,"timeout":3000,"retryAttempts":3,"retryInterval":1500,"reconnectionTimeout":3000,"failedAttempts":3,"subscriptionsPerConnection":5,"address":"redis://127.0.0.1:6379","subscriptionConnectionMinimumIdleSize":1,"subscriptionConnectionPoolSize":50,"connectionMinimumIdleSize":10,"connectionPoolSize":64,"database":0,"dnsMonitoring":false,"dnsMonitoringInterval":5000},"threads":0,"nettyThreads":0,"codec":{"class":"org.redisson.codec.JsonJacksonCodec"},"codecProvider":{"class":"org.redisson.codec.DefaultCodecProvider"},"resolverProvider":{"class":"org.redisson.liveobject.provider.DefaultResolverProvider"},"redissonReferenceEnabled":true,"useLinuxNativeEpoll":false}

测试写法

public class LockExamples {
    public static void main(String[] args) throws InterruptedException {
        // 默认连接上127.0.0.1:6379
        RedissonClient client = Redisson.create();
        // RLock 继承了 java.util.concurrent.locks.Lock 接口
        RLock lock = client.getLock("lock");

        lock.lock();
        System.out.println("lock acquired");

        Thread t = new Thread(() -> {
            //获取锁,传入要锁的key
            RLock lock1 = client.getLock("lock");
            //获取锁
            lock1.lock();
            System.out.println("lock acquired by thread");
            //解锁
            lock1.unlock();
            System.out.println("lock released by thread");
        });

        t.start();
        t.join(1000);
        
        lock.unlock();
        System.out.println("lock released");

        t.join();

        client.shutdown();
    }
}

飞花令的写法

    @Override
    @Transactional(rollbackFor = Exception.class)
    public FlyingFlowerV1Vo insert(FlyingFlowerReq flyingFlowerReq, String userId) throws Exception {
        //对进来的用户加锁
        RLock userLock = redissonClient.getLock(RedissonKey.USER_ID + userId);
        try{
            //尝试加锁, 最多等待1秒, 1000秒后自动解锁
            boolean getUserLock = userLock.tryLock(1, 1000, TimeUnit.MILLISECONDS);
            if (getUserLock) {
                //业务逻辑的代码,通常在插入修改的操作方法上进行加锁
        }catch (Exception e){
            //提示
            System.out.println("接令频繁"+ userId);
            throw new ResultInfo(ResultUtils.error("接令频繁,请稍后再试"));
        }finally {
            //解锁
            if (userLock.isLocked()) {
                if (userLock.isHeldByCurrentThread()) {
                    userLock.unlock();
                }
            }
        }
        return null;
    }

到此这篇关于java中redissonClient 分布式锁的使用的文章就介绍到这了,更多相关java redissonClient 分布式锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Spring-Boot中如何使用@Value注解注入集合类

    在Spring-Boot中如何使用@Value注解注入集合类

    这篇文章主要介绍了在Spring-Boot中如何使用@Value注解注入集合类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 如何使用Idea搭建全注解式开发的SpringMVC项目

    如何使用Idea搭建全注解式开发的SpringMVC项目

    这篇文章主要介绍了如何使用Idea搭建全注解式开发的SpringMVC项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • RocketMQ Namesrv架构工作原理详解

    RocketMQ Namesrv架构工作原理详解

    这篇文章主要为大家介绍了RocketMQ Namesrv架构工作原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • java启动jar包设置启动参数的实现

    java启动jar包设置启动参数的实现

    本文主要介绍了java启动jar包设置启动参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    过大的日志文件维护起来存在诸多问题,所以最好是能够按日或按大小切分日志文件,下面小编给大家带来了Spring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • JPA延迟加载no Session报错解决分析

    JPA延迟加载no Session报错解决分析

    这篇文章主要为大家介绍了JPA延迟加载no Session报错解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java 3D入门之基本图形功能 附源码

    Java 3D入门之基本图形功能 附源码

    Java3D API是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。这种全新的设计使3D技术变得不再繁琐且可以加入到J2SE、J2EE的整套架构,故保证了Java3D技术强大的扩展性
    2021-10-10
  • Servlet会话技术基础解析

    Servlet会话技术基础解析

    这篇文章主要介绍了Servlet会话技术基础解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • String字符串拼接方法concat和+的效率对比

    String字符串拼接方法concat和+的效率对比

    这篇文章主要介绍了String字符串拼接方法concat和+的效率对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SparkSQL中的JSON内置函数全解析

    SparkSQL中的JSON内置函数全解析

    你是否曾经为处理JSON数据而头疼?SparkSQL为我们提供了强大的内置JSON函数,让JSON处理变得轻而易举,本文将带你深入了解这些函数,感兴趣的朋友一起看看吧
    2024-08-08

最新评论