首页 > 数据库 >SpringBoot高级开发(8)SpringBoot使用Lettuce设置多个RedisTemplate实例

SpringBoot高级开发(8)SpringBoot使用Lettuce设置多个RedisTemplate实例

时间:2023-12-06 23:12:19浏览次数:56  
标签:SpringBoot spring redis db Lettuce 连接池 org import RedisTemplate

copy from:https://xiaomozhang.github.io/2021/02/07/spring-boot-lettuce-multi-instance/

项目pom配置

使用Spring Boot集成Redis,只需要将spring-boot-starter-data-rediscommons-pool2加到依赖即可

  xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
</dependency>

配置文件

spring.redis开头的都是Spring Boot自动注入需要加载的配置

  yaml
spring:
  redis:
    database: 0
    host: localhost
    port: 6379
    password:
    timeout: 60000
    lettuce:
      pool:
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-idle: 8 # 连接池中的最大空闲连接 默认 8
        min-idle: 0 # 连接池中的最小空闲连接 默认 0
  redis-db-2:
    database: 2
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 60000
    lettuce:
      pool:
        max-active: 8
        max-wait: 8
        max-idle: 8
        min-idle: 0

RedisConfigure

  java
package com.xiaozhangge.redis.configure;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.vavr.Tuple;
import io.vavr.Tuple6;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * Created by xiaozhangge on 2020-01-10.
 *
 * @Value("${spring.redis-db-2.database}") int database,
 * @Value("${spring.redis-db-2.host}") String host,
 * @Value("${spring.redis-db-2.port}") int port,
 * @Value("${spring.redis-db-2.password}") String password,
 * @Value("${spring.redis-db-2.timeout}") long timeout,
 * @Value("${spring.redis-db-2.lettuce.pool.max-active}") int maxActive,
 * @Value("${spring.redis-db-2.lettuce.pool.max-wait}") int maxWait,
 * @Value("${spring.redis-db-2.lettuce.pool.max-idle}") int maxIdle,
 * @Value("${spring.redis-db-2.lettuce.pool.min-idle}") int minIdle
 */
@EnableCaching
@Configuration
public class RedisConfigure {
  /**
       * string redis Template创建操作
       *
       * @param database  Redis数据库索引
       * @param timeout   连接超时时间(秒)
       * @param maxActive 连接池最大连接数(使用负值表示沒有限制)
       * @param maxWait   连接池最大等待时间(使用负值表示沒有限制)
       * @param maxIdle   连接池中的最大空闲连接
       * @param minIdle   连接池中的最小空闲连接
       * @param host      Redis服务地址
       * @param password  Redis服务密码
       * @param port      Redis服务器连接端口
       */
      @Bean(name = "stringRedisTemplate")
      public StringRedisTemplate stringRedisTemplate(
              @Value("${spring.redis-db-2.database}")
                      int database,
              @Value("${spring.redis-db-2.timeout:5}")
                      long timeout,
              @Value("${spring.redis-db-2.lettuce.pool.max-active}")
                      int maxActive,
              @Value("${spring.redis-db-2.lettuce.pool.max-wait}")
                      int maxWait,
              @Value("${spring.redis-db-2.lettuce.pool.max-idle}")
                      int maxIdle,
              @Value("${spring.redis-db-2.lettuce.pool.min-idle}")
                      int minIdle,
              @Value("${spring.redis-db-2.host}")
                      String host,
              @Value("${spring.redis-db-2.password}")
                      String password,
              @Value("${spring.redis-db-2.port}")
                      int port
      ) {
          // connection config
          RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
          configuration.setHostName(host);
          configuration.setPort(port);
          configuration.setPassword(RedisPassword.of(password));
          configuration.setDatabase(database);

          // pool config
          GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
          genericObjectPoolConfig.setMaxTotal(maxActive);
          genericObjectPoolConfig.setMinIdle(minIdle);
          genericObjectPoolConfig.setMaxIdle(maxIdle);
          genericObjectPoolConfig.setMaxWaitMillis(maxWait);

          // create connection factory
          LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
          builder.poolConfig(genericObjectPoolConfig);
          builder.commandTimeout(Duration.ofSeconds(timeout));
          LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(
                  configuration, builder.build()
          );
          connectionFactory.afterPropertiesSet();

          // create redis template
          return createStringRedisTemplate(connectionFactory);

      }

      /**
       * 建立StringRedisTemplate
       * 此function不能加 @Bean 否则onnectionFactory 将会一律采用预设值
       */
      private StringRedisTemplate createStringRedisTemplate(
              RedisConnectionFactory redisConnectionFactory
      ) {
          StringRedisTemplate redisTemplate = new StringRedisTemplate();
          redisTemplate.setConnectionFactory(redisConnectionFactory);
          redisTemplate.setKeySerializer(new StringRedisSerializer());
          redisTemplate.setValueSerializer(new StringRedisSerializer());
          return redisTemplate;
      }
}

具体默认的配置大家可以参考开篇讲解的上一篇文章,我这里仅仅介绍了自定义额外的连接信息。

首先是第一个连接配置信息,这个名称是first,代表第一组Redis连接池配置信息,功能名称会影响到后续在使用上的操作,如果想要另外取名的话可以将bean加上名称@Bean(name=”您的名字””)
在这个函数中接收到框架原型建立的RedisConnectionFactory为参数,将该该工厂传到最底下的createRedisTemplate()来建立StringRedisTemplate,所以如果希望建立的是其他RedisTemplate连接模板的话就可以修改createRedisTemplate()
Redis连接池,如此一来要我们开发过程中操作时忘了标注要使用Redis的话,便会采用这默认的连接池,
接着来看第二个功能,在这个功能中可以看到设定档中第二条连接池的参数,前面提到我们只需要修改连接池的地址信息,所以关于pool等相关设定还是抓第一条连接池的,这边就看大家有没有需要自行修改〜
设置完毕第二条连接池的设置后,进行的事情实际上就是自己建立连接工厂,先设置好Config相关对象,然后创建LettuceConnectionFactory对象,最后和第一个功能相同,将工厂引入createRedisTemplate()来生成RedisTemplate连接池
所以实际上我们要做的事情就是,设置定义的连接池就自定义的factory建立RedisTemplate物件来操作,额外的连线就进入设定档后,自己添加factory来生成RedisTemplate连接模板,就是这么简单〜
连接池建立好后就是实际的操作啦,操作方式也很简单,就用@Autowired就好,只是要带名称让Spring Boot知道你要使用的是其中RedisTemplate哪个连接池即可

  java
@Autowired
@Qualifier("first")
StringRedisTemplate firstRedisTemplate;
@Autowired
@Qualifier("stringRedisTemplate")
StringRedisTemplate secondRedisTemplate;

翻译

搜索

复制

标签:SpringBoot,spring,redis,db,Lettuce,连接池,org,import,RedisTemplate
From: https://www.cnblogs.com/dongfangchun/p/17880737.html

相关文章

  • 【SpringBootWeb入门-6】请求响应-请求参数-数组集合参数&Json参数&路径参数
    这篇我们接着上一篇的请求参数来讲解另外几个常见参数的接收以及封装:数组集合参数、Json参数、路径参数。数组集合参数1、数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数在Postman接口测试新建测试,获取请求数组参数type。然后新建参数处......
  • SpringBoot集成Jasypt实现数据加密
    1、环境说明JDK1.8+SpringBoot2.7 2、添加pom依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency> 3......
  • @SpringBootTest 和 @RunWith 注解不能识别 单元测试第一步引入maven依赖
    @SpringBootTest和@RunWith注解不能识别单元测试第一步引入maven依赖一、背景    最近在预研 Rocketmq,在写小例子的时候,需要编写测试代码,突然间发现我的 @SpringBootTest 和 @RunWith 这两个注解不能识别,于是展开了我的问题排查过程。问题截图如下:二、问题排......
  • @RunWith注解找不到,怎么办? spring-boot-starter-test 2.5.5 版本只需要在类上加上@Spr
    @RunWith注解找不到,怎么办?spring-boot-starter-test2.5.5版本只需要在类上加上@SpringBootTest即可,不需要再加@RunWith()注解了。1、新版spring-boot-starter-test不再集成junit,而是junit-jupiter在这里,先说明我使用的版本SpringBoot2.5.5spring-boot-starter-test2.5......
  • SpringBoot学习系列-YAML(后缀为.yml)配置文件使用
    学习使用: YAML 是一种可读性高,以数据为中心的数据序列化格式。什么是序列化?序列化指的是将自定义的对象或者其他数据进行持久化,从而方便进行传输和存储。一般情况下,能够序列化的数据一定能够通过反序列化恢复。注:序列化的目的之一是方便持久化数据,定义本身和持久化应该没啥......
  • SpringBoot Seata 死锁问题排查
    现象描述:SpringBoot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出但是,奇怪的是,本地可以正常启动好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问题,这个不是重点,重点是怎么让它启动起来。(PS:我猜测可能是环境不同造成的,包括操作系统不同和JD......
  • springbootlearn01 ERROR汇总
    (1)关于IDEA未生成pom.xml文件通过springinitialize要确认[type]选项中为Mavenproject类型,不可选择其他(没有pom.xml)而POM(只会生成pom.xml)(2)关于spring-boot-starter-parent报红的解决方法关于mavenreload后仍无法加载包通过mvn-Uidea:idea命令重新加载maven包,具体操作是......
  • 小白使用springboot项目进行开发系统前期工作
    首先进行项目的创建,springboot项目创建有两种方式。可以使用idea直接创建springboot项目,可以使用阿里云的源,创建会快一点这里可以选择各种的依赖第二种就是直接创建maven项目,直接导入pom坐标类似于这种,点击刷新即可点击查看代码<dependency>......
  • SpringBoot项目中集成自定义公共Maven依赖如何集成与调试
    场景Nexus-在项目中使用Maven私服,Deploy到私服、上传第三方jar包、在项目中使用私服jar包:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/101391279Maven项目在pom文件中引入lib下的第三方jar包并打包进去:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det......
  • java springboot 读取自定义配置文件
    javaspringboot读取自定义配置文件application.properties、test.properties maven中引用:<dependency><groupId>org.apache.commons</groupId><artifactId>commons-configuration2</artifactId><version......