广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringBoot整合Redisson
  • 534
分享到

SpringBoot整合Redisson

springbootjava后端redis 2023-10-26 21:10:15 534人浏览 八月长安
摘要

Redisson官方文档: https://github.com/redisson/redisson/wiki 简介:Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Gri

Redisson官方文档: https://github.com/redisson/redisson/wiki

简介:Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)。充分 的利用了 Redis 键值数据库提供的一系列优势,基于 Java 实用工具包中常用接口,为使用者 提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工 具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式 系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 

一.简单使用

1、导入依赖

                            org.redisson            redisson            3.16.8        

2、新建Redisson配置

import org.redisson.Redisson;import org.redisson.api.RedissonClient;import org.redisson.config.Config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MyRedissonConfig {        @Bean(destroyMethod = "shutdown")    public RedissonClient redissonClient(){        // 创建配置 指定redis地址及节点信息        Config config = new Config();        config.useSingleServer().setAddress("XXX.XX.XX.X(redis地址):端口").setPassword("xxxxxxxxx");        // 根据config创建出RedissonClient实例        RedissonClient redissonClient = Redisson.create(config);        return redissonClient;    }}

 3、测试

 @Autowired    RedissonClient redissonClient;    @Test    void redisson(){        System.out.println(redissonClient);    }

运行测试代码发现控制台有异常,报错信息为 :

java.lang.IllegalArgumentException: Redis url should start with redis:// or rediss:// (for SSL connection)

提示我们要在地址前加上redis:// ,SSL连接则需要加上rediss://

所以需要改为setAddress("redis://XXX.XX.XX.X:6379")即可

打印结果:

org.redisson.Redisson@6159fb3c

二.分布式

1、可重入锁

基于Redis的Redisson分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口。同时还提供了异步(Async)反射式(Reactive)RxJava2标准的接口。

常用代码:

RLock lock = redisson.getLock("anyLock");// 最常见的使用方法lock.lock();

测试代码:

@ResponseBody    @GetMapping("/hello")    public String hello() {        // 1.获取一把锁,只要锁的名字一样,就是同一把锁        RLock lock = redisson.getLock("my-lock");        lock.lock(); // 阻塞式等待。默认加的锁是30s时间        try {            // 1、锁的自动续期,运行期间自动给锁续上新的30s,无需担心业务时间长,锁过期会自动被释放            // 2、加锁的业务只要运行完成,就不会给当前锁续期,即使不手动释放锁,锁默认在30s后自动释放,避免死锁            System.out.println("加锁成功,执行业务代码..."+Thread.currentThread().getId());            Thread.sleep(30000);        } catch (Exception e) {            e.printStackTrace();        }finally {            System.out.println("释放锁..."+Thread.currentThread().getId());            lock.unlock();        }        return "Hello!";    }

结果:

加锁成功,执行业务代码...99释放锁...99

可以发现,当我们的业务超长时,运行期间,redisson会为我们自动续期锁,业务执行完将不会续期,即使不手动释放锁,锁也会默认在30s后释放。

2、看门狗机制

redisson 中提供的续期机制

开一个监听线程,如果方法还没执行完,就帮你重置 redis 锁的过期时间。

原理:

  1. 启动定时任务重新给锁设置过期时间,默认过期时间是 30 秒,每 10 秒(看门狗默认事件的1/3)续期一次(补到 30 秒)
  2. 如果线程挂掉(注意 debug 模式也会被它当成服务器宕机),则不会续期
  3. 只有lock.lock(); 会有看门狗机制;
  4. lock.lock(10,,TimeUnit.SECONDS);手动设置过期时间的话,则不会有看门狗机制(推荐)

3、读写锁

一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁.(该数据加写锁、读数据加读锁)

当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.
当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁.

测试读写锁代码:

        @Autowired    RedissonClient redisson;    @Autowired    RedisTemplate redisTemplate;    @ResponseBody    @GetMapping("/write")    public String writeValue(){        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");        RLock rLock = lock.writeLock();        String s = "";        try {            s = UUID.randomUUID().toString();            // 模拟业务时间                Thread.sleep(30000);        } catch (Exception e){        }finally {            rLock.unlock();        }        redisTemplate.opsForValue().set("writeValue",s);        return s;    }    @GetMapping(value = "/read")    @ResponseBody    public String readValue() {        String s = "";        RReadWriteLock readWriteLock = redisson.getReadWriteLock("rw-lock");        //加读锁        RLock rLock = readWriteLock.readLock();        try {            rLock.lock();            s = (String) redisTemplate.opsForValue().get("writeValue");            TimeUnit.SECONDS.sleep(10);        } catch (Exception e) {            e.printStackTrace();        } finally {            rLock.unlock();        }        return s;    }

当我们访问 localhost:10000/write写入数据时,因为线程睡眠了30s(模拟业务),此时我们访问  localhost:10000/read 将会一直阻塞,等待写锁释放,读锁才能占锁从而获取执行业务。

4、信号量

信号量为存储在redis中的一个数字,当这个数字大于0时,即可以调用acquire()方法增加数量,也可以调用release()方法减少数量,但是当调用release()之后小于0的话方法就会阻塞,直到数字大于0。 

可以应用于秒杀、限流等操作。

简单应用

    @GetMapping(value = "/park")    @ResponseBody    public String park() {        RSemaphore park = redisson.getSemaphore("park");        try {            park.acquire();// 获取一个信号量(redis中信号量值-1),如果redis中信号量为0了,则在这里阻塞住,直到信号量大于0,可以拿到信号量,才会继续执行。        } catch (InterruptedException e) {            e.printStackTrace();        }        return "ok";    }    @GetMapping(value = "/Go")    @ResponseBody    public String go() {        RSemaphore park = redisson.getSemaphore("park");        park.release();  //释放一个信号量(redis中信号量值+1)        return "ok";    }

其中:redisson.getSemaphore("park").acquire() 当信号量为0时将会一直阻塞,直到信号量大于0,才会继续执行。但redisson.getSemaphore("park").tryAcquire() 将不会阻塞,能拿到信号量就返回true,否则返回false,lock.tryLock() 同理。

5、闭锁

在要完成某些运算时,只有其它线程的运算全部运行完毕,当前运算才继续下去。

        模拟场景:

                学校放假,学校门卫锁门必须等待所有班级全部离开,才将学校大门锁住。

    @GetMapping(value = "/lockDoor")    @ResponseBody    public String lockDoor() throws InterruptedException {        RCountDownLatch lockDoor = redisson.getCountDownLatch("lockDoor");        lockDoor.trySetCount(5); // 设置计数为5        lockDoor.await(); //等待闭锁完成        return "放假啦...";    }    @GetMapping(value = "/go/{id}")    public String go(@PathVariable("id") Integer id)  {        RCountDownLatch lockDoor = redisson.getCountDownLatch("lockDoor");        lockDoor.countDown(); // 计数减1        return id+"班都走光了";    }

结果:我们先访问 /lockDoor 线程将会阻塞,连续访问五次 /go/1 ,输出 放假了。

三.缓存数据一致性解决方案

 

尽量给锁加上过期时间;对于读写状态时,应该加上分布式读写锁。

来源地址:https://blog.csdn.net/weixin_53922163/article/details/127482085

--结束END--

本文标题: SpringBoot整合Redisson

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

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

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

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

下载Word文档
猜你喜欢
  • SpringBoot整合Redisson
    Redisson官方文档: https://github.com/redisson/redisson/wiki 简介:Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Gri...
    99+
    2023-10-26
    spring boot java 后端 redis
  • SpringBoot整合Redisson的步骤(单机版)
    目录Redisson、Jedis、Lettuce优缺点对比 (1)Redisson (2)Jedis (3)Lettuce SpringBoot整合Redisson 1.添加Mave...
    99+
    2022-11-12
  • SpringBoot整合Redisson实现分布式锁
    目录一、添加依赖二、redis配置文件三、新建配置类四、使用分布式锁可重入锁读写锁信号量(Semaphore)闭锁(CountDownLatch)Redisson是架设在redis基...
    99+
    2022-11-12
  • SpringBoot怎么整合分布式锁redisson
    这篇文章主要介绍“SpringBoot怎么整合分布式锁redisson”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么整合分布式锁redisson”文章能帮助大家解决问题。1、...
    99+
    2023-07-05
  • SpringBoot整合Redisson如何实现分布式锁
    这篇文章将为大家详细讲解有关SpringBoot整合Redisson如何实现分布式锁,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redisson是架设在redis基础上的一个Java驻内存数据网格(In...
    99+
    2023-06-25
  • SpringBoot整合分布式锁redisson的示例代码
    目录1、导入maven坐标2、redisson配置类(如果redis没有密码就不需要private String password)3、创建redisson的bean4、测试,入队5...
    99+
    2023-02-23
    SpringBoot整合分布式锁redisson SpringBoot整合 redisson
  • spring整合redisson开启缓存方式
    目录spring整合redisson开启缓存@Cacheable@CachePut@CacheEvictspring集成redisson踩过的坑spring整合redisson开启缓...
    99+
    2022-11-12
  • SpringBoot整合MybatisPlus
    文章目录 前言一、MybatisPlus是什么?二、使用步骤1.导入依赖2.编写配置文件3.编写Controller和实体类4.编写持久层接口mapper5.启动类加包扫描注解6.测试 总...
    99+
    2023-10-02
    spring boot mybatis java
  • springboot 整合netty
    增加netty依赖 io.netty netty-all 4.1.28.Final 创建netty init 类 public class WsServerIn...
    99+
    2023-10-08
    spring boot java 后端
  • springboot整合mongodb
    目录1.MongoDB的安装和简介1.1简介1.2安装1.3配置环境变量和检查安装情况2.springboot集成mongodb2.1pom文件中maven的引入2.2properties文件配置2.3dao层的编写2....
    99+
    2023-03-31
    Java Springboot整合mongodb mongodb的安装使用
  • Springboot整合HBase
    Springboot整合HBase数据库 1、添加依赖 com.spring4all spring-boot-starter-hbase org.springframework.d...
    99+
    2023-09-05
    spring boot java 后端
  • SpringBoot整合Nacos
    SpringBoot整合Nacos 文章目录 SpringBoot整合Nacos一、准备工作1、Nacos服务2、添加依赖 二、注册中心三、配置中心1、配置管理2、命名空间 ...
    99+
    2023-09-05
    spring boot java 服务发现
  • SpringBoot整合Feign
    目录 1、Feign-简介2、spring-cloud快速整合OpenFeign3、Feign日志4、Feign契约配置5、Feign配置超时时间6、Feign拦截器7、Feign断路器 ...
    99+
    2023-09-14
    spring java 后端
  • springboot 整合JDBC
    前提:配置数据库连接(见前面) 一、步骤 导包 org.springframework.boot spring-boot-starter-jdbc 操作 @Autowired private Jdb...
    99+
    2018-12-24
    springboot 整合JDBC 数据库入门 数据库基础教程 数据库 mysql
  • springboot整合Shiro
    目录什么是ShiroShiro的三大核心概念Shiro功能介绍Springboot整合Shiro导入依赖javaConfigRealmControllerShiro整合thymele...
    99+
    2022-11-12
  • SpringBoot整合SpringDataJPA
    目录SpringBoot整合JPAJPA & Spring Data JPAHibernate & JPA1、JPA2、JPA & Hibernate 关系H...
    99+
    2022-11-12
  • 【SpringBoot整合JWT】
    目录 一、什么是JWT 二、JWT能做什么  三、为什么是JWT  1、基于传统的Session认证 2、基于JWT认证 四、JWT的结构是什么  五、JWT的第一个程序 六、封装JWT工具类  七、整合SpringBoot使用 一、什...
    99+
    2023-09-01
    spring boot 后端 java
  • springboot整合sse
    链接: SpringBoot 实现SSE 服务器发送事件 链接: SpringBoot 实现SSE 服务器发送事件 链接: Springboot之整合SSE实现消息推送 链接: springboot ...
    99+
    2023-09-01
    spring boot 服务器 java
  • SpringBoot 整合knife4j
    文章目录 SpringBoot 整合knife4j引入knife4j注解案例knife4j增强功能接口添加作者资源屏蔽访问页面加权控制接口排序分组排序请求参数缓存过滤请求参数禁用调试禁用搜索框 SpringBoot 整...
    99+
    2023-08-21
    spring boot java spring
  • Springboot整合knife4j
    本文介绍knife4j的用法,如何整合到springboot项目中 文章目录 前言环境搭建基本配置常用注解测试 前言 参考文档: 官方文档版本问题文档注解 在项目开发中,自测和联调时,一篇详细通用的接口文档显得尤为重要,不...
    99+
    2023-08-18
    spring boot java spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作