SpringBoot配置Redis多集群数据源
java1234
共 17173字,需浏览 35分钟
· 2021-04-19
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | 孙昌恒
来源 | urlify.cn/uQBV3m
前提条件
两个数据源, 且两个数据源都是以集群方式部署的
Lettuce 接入
本次测试的数据源
数据源1: 192.168.10.6380
数据源2: 192.168.10.6381
pom依赖文件
<!--pom.xml-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--测试依赖包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--redis连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
配置文件
// application.yml
spring:
redis:
password: your'spassword # 密码(默认为空)
timeout: 6000 # 连接超时时长(毫秒)
cluster:
nodes: 192.168.10.1:6380
max-redirects: 3 # 获取失败 最大重定向次数
lettuce:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
secondaryRedis:
cluster:
nodes: 192.168.10.1:6381
password: your'spassword
多集群配置文件
// RedisConfig.java
package top.sunchangheng.multiredis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.util.HashMap;
import java.util.Map;
/*** 功能描述: 多集群数据源配置
*/
@Configuration
public class RedisConfig {
@Autowired
private Environment environment;
/**
* 配置lettuce连接池
*/
@Bean
@Primary
@ConfigurationProperties (prefix = "spring.redis.cluster.lettuce.pool")
public GenericObjectPoolConfig redisPool() {
return new GenericObjectPoolConfig();
}
/**
* 配置第一个数据源的
*/
@Bean ("redisClusterConfig")
@Primary
public RedisClusterConfiguration redisClusterConfig() {
Map<String, Object> source = new HashMap<>(8);
source.put("spring.redis.cluster.nodes", environment.getProperty("spring.redis.cluster.nodes"));
RedisClusterConfiguration redisClusterConfiguration;
redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration",
source));
redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));
return redisClusterConfiguration;
}
/**
* 配置第一个数据源的连接工厂
* 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory
*/
@Bean ("lettuceConnectionFactory")
@Primary
public LettuceConnectionFactory lettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier (
"redisClusterConfig") RedisClusterConfiguration redisClusterConfig) {
LettuceClientConfiguration clientConfiguration =
LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();
return new LettuceConnectionFactory(redisClusterConfig, clientConfiguration);
}
/**
* 配置第一个数据源的RedisTemplate
* 注意:这里指定使用名称=factory 的 RedisConnectionFactory
* 并且标识第一个数据源是默认数据源 @Primary
*/
@Bean ("redisTemplate")
@Primary
public RedisTemplate redisTemplate(@Qualifier ("lettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {
return getRedisTemplate(redisConnectionFactory);
}
/**
* 配置第二个数据源
*/
@Bean ("secondaryRedisClusterConfig")
public RedisClusterConfiguration secondaryRedisConfig() {
Map<String, Object> source = new HashMap<>(8);
source.put("spring.redis.cluster.nodes", environment.getProperty("spring.secondaryRedis.cluster.nodes"));
RedisClusterConfiguration redisClusterConfiguration;
redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration",
source));
redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));
return redisClusterConfiguration;
}
@Bean ("secondaryLettuceConnectionFactory")
public LettuceConnectionFactory secondaryLettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier (
"secondaryRedisClusterConfig") RedisClusterConfiguration secondaryRedisClusterConfig) {
LettuceClientConfiguration clientConfiguration =
LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();
return new LettuceConnectionFactory(secondaryRedisClusterConfig, clientConfiguration);
}
/**
* 配置第一个数据源的RedisTemplate
* 注意:这里指定使用名称=factory2 的 RedisConnectionFactory
*/
@Bean ("secondaryRedisTemplate")
public RedisTemplate secondaryRedisTemplate(@Qualifier ("secondaryLettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {
return getRedisTemplate(redisConnectionFactory);
}
/*** 功能描述: 根据连接工厂获取一个RedisTemplate
*/
private RedisTemplate getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
到这里, 已经配置好了多集群数据源了, 但是需要注意的是: 注入redisTempalte
时, 需要根据名称进行依赖注入, 如下图中的测试案例
测试
// RedisTest.java
package top.sunchangheng.multiredis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith (SpringRunner.class)
public class RedisTest {
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Autowired
@Qualifier ("secondaryRedisTemplate")
RedisTemplate<String, Object> secondaryRedisTemplate;
@Autowired
private Environment environment;
@Test
public void testEnvironment() {
System.out.println("开始测试");
String property = environment.getProperty("spring.secondaryRedis.cluster.nodes");
System.out.println("property = " + property);
System.out.println("over");
}
// 同时设置两个数据源的数据
@Test
public void testTemplateSet() {
System.out.println("同时设置数据");
redisTemplate.opsForValue().set("redis-key2", "redisTemplate");
secondaryRedisTemplate.opsForValue().set("redis-key2", "secondaryRedisTemplate");
System.out.println("over");
}
// 同时获取两个数据源的数据
@Test
public void testTemplateGet() {
System.out.println("同时获取数据");
Object key1 = redisTemplate.opsForValue().get("redis-key2");
Object key2 = secondaryRedisTemplate.opsForValue().get("redis-key2");
System.out.println("key1 = " + key1);
System.out.println("key2 = " + key2);
System.out.println("over");
}
}
粉丝福利:Java从入门到入土学习路线图
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈
评论
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
springboot第70集:字节跳动后端三面经,一文让你走出微服务迷雾架构周刊
创建一个使用Kubernetes (K8s) 和 Jenkins 来自动化 GitLab 前端项目打包的CI/CD流水线,需要配置多个组件。下面,我将概述一个基本的设置步骤和示例脚本,以帮助你理解如何使用这些工具整合一个自动化流程。前提条件确保你已经有:Kubernetes 集群:用于部署 Jenk
程序源代码
0
三年前端还不会配置Nginx,被老板打了,今天一口气学完
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群引言先来看看为何需要做请求负载。 早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务
程序员成长指北
4
Redis 是怎么从单体架构发展到分布式缓存的?
图解学习网站:https://xiaolincoding.comRedis 架构是如何一步一步发展到今天的样子的?2010 年 - 单体 RedisRedis 1.0 于 2010 年发布,当时的架构非常简单。它通常用作业务应用程序的缓存。不过,Redis 将数据存储在内存中。当我们重启 Redis
小林coding
10
多文件夹下Excel指定列的提取合并
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤红豆生南国,春来发几枝。一、前言大家好,我是崔艳飞,工作中经常遇到,从多个文件夹下的Excel中,提取指定列,再合并成新的Excel。几个文件夹还能应付,但要是有成百上千个文件夹,你就要
Python爬虫与数据挖掘
3
永久激活GPT4.0 + 多模态(文生图+图片解析)!终身使用!我上车了
GPT 4.0,太牛了🔥!!用GPT4.0生成个代码,轻轻松松就能帮你搞定如果你有想拍视频的想法,或者从事相关新媒体职业,那这个视频脚本生成就很适合你GPT4.0好用是好用,但它的价格也是真贵啊!一个月要 20 美元,折合大概 150 块人民币,一年就是 1800。MJ 绘画更是高攀不起的
Python客栈
0
再获殊荣!乐普新品平板多参数监护仪荣获两项国际大奖
近日,乐普新品平板多参数监护仪AIView VX凭借创新前瞻的设计理念及卓越不凡的产品体验,一举斩获“2024年德国iF设计奖”和“2024年德国红点奖”两项国际大奖,再度彰显乐普独特产品魅力及研发与工业设计的强大实力。作为国际公认的全球工业设计顶级奖项,红点设计奖与德国“iF奖”、美国“IDEA奖
乐普医疗AI
1
Spring Boot 优雅实现多租户架构
来源:blog.csdn.net/u010349629/article/details/130737253👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0
小哈学Java
10