Springboot配置多Redis源
Springboot配置多Redis源
一、背景
因项目部署了新集群,某些缓存数据需要在旧的redis上取,就必须配置多个数据源动态获取相对应的源以兼容业务。
二、配置依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
️注:commons-pool2依赖是为了使lettuce连接池生效,在springboot2后,redis默认使用lettuce连接池;而springboot2前则使用jredis的pool。
三、redis-yaml配置项
spring:
redis:
database: 19
host:
port: 6379
password:
timeout: 10000
common:
lettuce:
pool:
max-active: 3000 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 30 # 连接池中的最大空闲连接
max-wait: 3000 # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 10 # 连接池中的最小空闲连接
jr-live:
database: 0
host:
port:
password:
timeout: 10000
Ps:common配置项可以抽取出来,目前因时间问题不作处理。
四、redis配置类
首先需要初始化对应数据源的lettuceConnection工厂
/**
* 原redis Factory
* @param hostName
* @param port
* @param index
* @return
* @author simon
*/
@Bean(name = "RedisConnectionFactoryJrLive")
public LettuceConnectionFactory connectionFactoryJrLive(
@Value("${spring.jr-live.host}") String hostName,
@Value("${spring.jr-live.port}") int port,
@Value("${spring.jr-live.password}") String password,
@Value("${spring.jr-live.database}") int index) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setDatabase(index);
redisStandaloneConfiguration.setHostName(hostName);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.commandTimeout(Duration.ofMillis(jrLiveTimeOut))
.poolConfig(genericObjectPoolConfig())
.build();
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration, clientConfig);
lettuceConnectionFactory.setShareNativeConnection(false);
return lettuceConnectionFactory;
}
// 连接池配置
@Bean
public GenericObjectPoolConfig genericObjectPoolConfig() {
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxTotal(maxTotal);
genericObjectPoolConfig.setMaxWaitMillis(maxWaitMillis);
return genericObjectPoolConfig;
}
配置redisTemplate实例
/**
* 龙直播redis
* @param factory
* @return
*/
@Bean(name = "redisTemplate")
@Primary
public RedisTemplate<String, Object> redisTemplate(@Qualifier("RedisConnectionFactory")
LettuceConnectionFactory factory){
// factory.setShareNativeConnection(false);
// factory.setValidateConnection(true);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
/* 使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化)
* key采用StringRedisSerializer, value采用Jackson2JsonRedisSerializer
* */
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> 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);
redisTemplate.setKeySerializer(stringRedisSerializer);//key序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); //value序列化
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
注:多数据源时尽量使用@Resorce(name = "beanName"),当然也可以使用@Qualifier注解。
附:
比较好用的多redis数据源util
@Component
public class RedisUtil {
private static RedisTemplate RedisWhDatabase;
private static StringRedisTemplate stringRedisTemplateWh;
private static RedisTemplate RedisEsDatabase;
private static StringRedisTemplate stringRedisTemplateEs;
@Autowired
public RedisUtil(@Qualifier("RedisWhDatabase") RedisTemplate RedisWhDatabase,
@Qualifier("StringRedisTemplateWh") StringRedisTemplate stringRedisTemplateWh,
@Qualifier("RedisEsDatabase") RedisTemplate RedisEsDatabase,
@Qualifier("StringRedisTemplateEs") StringRedisTemplate stringRedisTemplateEs) {
RedisUtil.RedisWhDatabase = RedisWhDatabase;
RedisUtil.stringRedisTemplateWh = stringRedisTemplateWh;
RedisUtil.RedisEsDatabase = RedisEsDatabase;
RedisUtil.stringRedisTemplateEs = stringRedisTemplateEs;
}
public static void set(String key, String value, Long time) throws IOException {
}
public static String get(String key) {
}
}
Springboot配置多Redis源的更多相关文章
- springboot配置redis
https://www.cnblogs.com/xiaoping1993/p/7761123.html https://www.cnblogs.com/gdpuzxs/p/7222309.html s ...
- springboot中配置主从redis
测试redis的主从配置 redis实例 文件夹名称如下 redis_master_s redis_slaver1_s redis_slaver2_s redis.conf文件 master的redi ...
- springboot配置redis+jedis,支持基础redis,并实现jedis GEO地图功能
Springboot配置redis+jedis,已在项目中测试并成功运行,支持基础redis操作,并通过jedis做了redis GEO地图的java实现,GEO支持存储地理位置信息来实现诸如附近的人 ...
- redis之哨兵 springboot配置
转载自https://blog.csdn.net/m0_37367413/article/details/82018125 springboot整合redis哨兵方式配置 2018年08月24日 14 ...
- SpringBoot原理深入及源码剖析(一) 依赖管理及自动配置
前言 传统的Spring框架实现一个Web服务需要导入各种依赖jar包,然后编写对应的XML配置文件等,相较而言,SpringBoot显得更加方便.快捷和高效.那么,SpringBoot究竟是如何做到 ...
- 【SpringBoot】整合Redis实战
========================9.SpringBoot2.x整合Redis实战 ================================ 1.分布式缓存Redis介绍 简介: ...
- Springcloud 中 SpringBoot 配置全集 (收藏版)
Springcloud 中 SpringBoot 配置全集 (收藏版) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群 ...
- SpringBoot简单整合redis
Jedis和Lettuce Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis serve ...
- 由浅入深学习springboot中使用redis
很多时候,我们会在springboot中配置redis,但是就那么几个配置就配好了,没办法知道为什么,这里就详细的讲解一下 这里假设已经成功创建了一个springboot项目. redis连接工厂类 ...
- Redis源码学习:Lua脚本
Redis源码学习:Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开 ...
随机推荐
- 一文搞懂容器运行时 Containerd
文章转载自:https://www.qikqiak.com/post/containerd-usage/ 在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为 ...
- 使用 openssl 生成 https 证书, 并在 nginx 中配置 https
创建一个私钥 openssl genrsa -des3 -out server.key 2048 注意:这一步需要输入私钥,否则会提示:You must type in 4 to 1023 chara ...
- Elasticsearch Dockerfile 例子
文章转载自:https://elasticstack.blog.csdn.net/article/details/111692444 前提条件 在继续执行本教程中概述的步骤之前,你需要具备一个关键的先 ...
- 关闭You have new mail in /var/spool/mail/root提醒
echo "unset MAILCHECK">> /etc/profile #以root权限执行 或者用sudo source /etc/profile cat /de ...
- Vue子->父组件传值
父组件引入: Import Test from'' 父页面使用: <Test ref="test" @m1="m2"><Test/> 子 ...
- 工厂里懂得mes和erp有发展吗?
在工厂里懂得MES.ERP肯定有发展啊,现在数字化转型.智能制造正当时,ERP.MES之类的系统是刚需,只是不同工厂启动的早晚有别,使用的系统不相同而已,但知识体系.逻辑.理念等大都是相通的.比如你熟 ...
- 【LeetCode第 313 场周赛】忘光光
比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...
- C语言实现扫雷游戏(完整版)
头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...
- uoj348【WC2018】州区划分
题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...
- HTML躬行记(2)——WebRTC基础实践
WebRTC (Web Real-Time Communications) 是一项实时通讯技术,在 2011 年由 Google 提出,经过 10 年的发展,W3C 于 2021 年正式发布 WebR ...