zoukankan      html  css  js  c++  java
  • 【SpringBoot】SpringBoot 整合Redisson

      Redis安装参考:【Redis】安装及简单使用

    一、Redission整合

    1、创建SpringBoot项目

      引入SpringBoot的redission启动器:

    1 <dependency>
    2     <groupId>org.redisson</groupId>
    3     <artifactId>redisson-spring-boot-starter</artifactId>
    4     <version>3.15.5</version>
    5 </dependency>

       查看jar包相关依赖

      

    2、配置redission

      1) 在application.yml 中添加redission 配置文件路径

     1 spring:
     2   redis:
     3     database: 0
     4     timeout: 3000
     5     password: 
     6     # 单节点模式
     7     host: 127.0.0.1
     8     port: 6379
     9     # redisson配置文件路径
    10     redisson:
    11       file: classpath:redisson.yml

      2) 新建resources/redission.yml文件, 内容如下: 

     1 # 单节点配置
     2 singleServerConfig:
     3   # 连接空闲超时,单位:毫秒
     4   idleConnectionTimeout: 10000
     5   # 连接超时,单位:毫秒
     6   connectTimeout: 10000
     7   # 命令等待超时,单位:毫秒
     8   timeout: 3000
     9   # 命令失败重试次数,如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。
    10   # 如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
    11   retryAttempts: 3
    12   # 命令重试发送时间间隔,单位:毫秒
    13   retryInterval: 1500
    14   # 密码
    15   password:
    16   # 单个连接最大订阅数量
    17   subscriptionsPerConnection: 5
    18   # 客户端名称
    19   clientName: myredis
    20   # 节点地址
    21   address: redis://127.0.0.1:6379
    22   # 发布和订阅连接的最小空闲连接数
    23   subscriptionConnectionMinimumIdleSize: 1
    24   # 发布和订阅连接池大小
    25   subscriptionConnectionPoolSize: 50
    26   # 最小空闲连接数
    27   connectionMinimumIdleSize: 32
    28   # 连接池大小
    29   connectionPoolSize: 64
    30   # 数据库编号
    31   database: 0
    32   # DNS监测时间间隔,单位:毫秒
    33   dnsMonitoringInterval: 5000
    34 # 线程池数量,默认值: 当前处理核数量 * 2
    35 #threads: 0
    36 # Netty线程池数量,默认值: 当前处理核数量 * 2
    37 #nettyThreads: 0
    38 # 编码
    39 codec: !<org.redisson.codec.JsonJacksonCodec> {}
    40 # 传输模式
    41 transportMode : "NIO"

    3、编辑启动类 和 配置类

      1) 主启动类 Application.java

     1 @SpringBootApplication
     2 public class Application {
     3 
     4     /**
     5      * 测试 Redis客户端 Redission 的使用
     6      * @param args
     7      */
     8     public static void main(String[] args) {
     9         SpringApplication.run(Application.class);
    10     }
    11 }

      2) 测试类 TestApplication.java

     1 package com.test.redis;
     2 
     3 import org.junit.Test;
     4 import org.junit.runner.RunWith;
     5 import org.redisson.api.RLock;
     6 import org.redisson.api.RedissonClient;
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.boot.test.context.SpringBootTest;
     9 import org.springframework.context.ApplicationContext;
    10 import org.springframework.test.context.junit4.SpringRunner;
    11 
    12 @RunWith(SpringRunner.class)
    13 @SpringBootTest
    14 public class TestApplication {
    15 
    16     @Autowired
    17     ApplicationContext context;
    18 
    19     // redisson客户端
    20     @Autowired
    21     RedissonClient redissonClient;
    22 
    23     // 测试分布式锁
    24     @Test
    25     public void terst1() throws InterruptedException {
    26         RLock lock = redissonClient.getLock("anyLock");
    27 
    28         new Thread(() -> {
    29             lock.lock();
    30 
    31             try {
    32                 System.out.println(Thread.currentThread().getName() + ":	 获得锁");
    33                 Thread.sleep(3000);
    34             } catch (InterruptedException e) {
    35                 e.printStackTrace();
    36             } finally {
    37                 System.out.println(Thread.currentThread().getName() + ":	 释放锁");
    38                 lock.unlock();
    39             }
    40         }).start();
    41 
    42 
    43         new Thread(() -> {
    44             lock.lock();
    45             try {
    46                 System.out.println(Thread.currentThread().getName() + ":	 获得锁");
    47                 Thread.sleep(3000);
    48             } catch (InterruptedException e) {
    49                 e.printStackTrace();
    50             } finally {
    51                 System.out.println(Thread.currentThread().getName() + ":	 释放锁");
    52                 lock.unlock();
    53             }
    54         }).start();
    55 
    56         Thread.sleep(100000);
    57     }
    58 }

    4、测试运行

      正常运行,且能加锁成功

      控制台输出:   redis数据:

      分布式锁原理参考:【Redis】分布式锁之Redis实现

    二、Redission整合原理

    1、Redission的自动配置类 RedissonAutoConfiguration

     1 @Configuration
     2 @ConditionalOnClass({Redisson.class, RedisOperations.class})
     3 
     4 // @AutoConfigureBefore表示在 RedisAutoConfiguration 之前注入
     5 @AutoConfigureBefore(RedisAutoConfiguration.class)
     6 
     7 @EnableConfigurationProperties({RedissonProperties.class, RedisProperties.class})
     8 public class RedissonAutoConfiguration {
     9     ......
    10     
    11     // Redisson属性配置
    12     @Autowired
    13     private RedissonProperties redissonProperties;
    14     // Redis属性配置
    15     @Autowired
    16 
    17 
    18     // 注入了 redisTemplate
    19     @Bean
    20     @ConditionalOnMissingBean(name = "redisTemplate")
    21     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    22         RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
    23         template.setConnectionFactory(redisConnectionFactory);
    24         return template;
    25     }
    26 
    27     // 注入了 stringRedisTemplate
    28     @Bean
    29     @ConditionalOnMissingBean(StringRedisTemplate.class)
    30     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    31         StringRedisTemplate template = new StringRedisTemplate();
    32         template.setConnectionFactory(redisConnectionFactory);
    33         return template;
    34     }
    35 
    36     // 注入了 redissonConnectionFactory redission连接工厂
    37     @Bean
    38     @ConditionalOnMissingBean(RedisConnectionFactory.class)
    39     public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
    40         return new RedissonConnectionFactory(redisson);
    41     }
    42 
    43     // 注入了 RedissonClient 客户端
    44     @Bean(destroyMethod = "shutdown")
    45     @ConditionalOnMissingBean(RedissonClient.class)
    46     public RedissonClient redisson() throws IOException {
    47         Config config = null;
    48         ......
    49         return Redisson.create(config);
    50     }
    51     ......
    52 }

      可以看到配置类中注入了Redission客户端对象 RedissonClient

  • 相关阅读:
    Gearman分布式任务处理系统(六)跨多种环境部署
    Gearman分布式任务处理系统(五)版本介绍、安装方法和使用说明
    Gearman分布式任务处理系统(四)Gearman协议
    Gearman分布式任务处理系统(三)libevent介绍
    Java课程笔记_4
    Lesson 13-14 How often do you exercise?
    Lesson 11-12 Men and Women
    Java课程笔记_3
    Lession 9-10 Cell Phone Taboos
    Lession 5-6 When you have a cold
  • 原文地址:https://www.cnblogs.com/h--d/p/14858848.html
Copyright © 2011-2022 走看看