SpringBoot结合Redis配置工具类实现动态切换库
作者:Coder-CT 发布时间:2022-04-15 14:14:13
标签:SpringBoot,Redis,动态切换库
我使用的版本是SpringBoot 2.6.4
可以实现注入不同的库连接或是动态切换库
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
redis:
# open自定义的,使用aop切面控制
open: false # 是否开启redis缓存 true开启 false关闭
database: 0
host: 127.0.0.1
password: 123456
# history 自定义,切换库索引
history: 1 #历史数据使用的库
port: 6379
timeout: 6000ms # 连接超时时长(毫秒)
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
配置类 , 默认0号库使用@Autowired注入,自定义库使用@Resource(name = “history”)注入
动态切库有个问题就是一旦切库 后面的数据就会一直保存在切换的库里面,比如实时数据需要保存在1号库,历史数据需要保存在2号库,切库后 实时的就会存历史里面、下面这种配置,想用哪个库就注入哪个库,不存在切库问题
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
* Redis配置
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory factory;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private Integer port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.history}")
private Integer history;
/**
* 实时数据库 配置 默认0号库
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 解决value不能转成string chens 2022-06-08
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
template.setConnectionFactory(factory);
return template;
}
/**
* redis历史数据库 配置 根据yml配置库
*/
@Bean("history")
public RedisTemplate<String, Object> redisTemplatetwo() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 解决value不能转成string
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
// 建立连接,设置库索引
redisStandaloneConfiguration.setDatabase(history);
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration, LettuceClientConfiguration.builder()
// 超时时间
.commandTimeout(Duration.ofMinutes(30)).build());
factory.afterPropertiesSet();
template.setConnectionFactory(factory);
return template;
}
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
@Bean
public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
return redisTemplate.opsForValue();
}
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}
工具类,setDbIndex()动态切换库,方法调用完成应切回默认库
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Redis工具类
*
* @author chens
*/
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Resource(name = "history")
private RedisTemplate<String, Object> historyTemplate;
@Autowired
private ValueOperations<String, String> valueOperations;
@Autowired
private HashOperations<String, String, Object> hashOperations;
@Autowired
private ListOperations<String, Object> listOperations;
@Autowired
private SetOperations<String, Object> setOperations;
@Autowired
private ZSetOperations<String, Object> zSetOperations;
// 默认数据库
private static Integer database = 0;
/**
* 默认过期时长,单位:秒
*/
public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
/**
* 不设置过期时长
*/
public final static long NOT_EXPIRE = -1;
private final static Gson gson = new Gson();
public void set(String key, Object value, long expire) {
valueOperations.set(key, toJson(value));
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
}
public void set(Integer index, String key, Object value, long expire) {
setDbIndex(index);
valueOperations.set(key, toJson(value));
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
}
public void set(String key, Object value) {
set(key, value, DEFAULT_EXPIRE);
}
public void set(Integer index, String key, Object value) {
setDbIndex(index);
set(key, value, DEFAULT_EXPIRE);
}
public <T> T get(String key, Class<T> clazz, long expire) {
String value = valueOperations.get(key);
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value == null ? null : fromJson(value, clazz);
}
public <T> T get(Integer index, String key, Class<T> clazz, long expire) {
setDbIndex(index);
String value = valueOperations.get(key);
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value == null ? null : fromJson(value, clazz);
}
// 获取实时数据集合 chens
public <T> List<T> getList(List<String> keys, Class<T> clazz) {
List<T> list = new LinkedList<>();
if (keys.size() < 1) return list;
for (String key : keys) {
T t = get(key, clazz, NOT_EXPIRE);
if (t != null) {
list.add(t);
}
}
//keys.forEach(i -> list.add(get(i, clazz, NOT_EXPIRE)));
return list;
}
public <T> T get(String key, Class<T> clazz) {
return get(key, clazz, NOT_EXPIRE);
}
public <T> T get(Integer index, String key, Class<T> clazz) {
setDbIndex(index);
return get(key, clazz, NOT_EXPIRE);
}
public String get(String key, long expire) {
String value = valueOperations.get(key);
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value;
}
public String get(Integer index, String key, long expire) {
setDbIndex(index);
String value = valueOperations.get(key);
if (expire != NOT_EXPIRE) {
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value;
}
public String get(String key) {
return get(key, NOT_EXPIRE);
}
public String get(Integer index, String key) {
setDbIndex(index);
return get(key, NOT_EXPIRE);
}
public void delete(String key) {
redisTemplate.delete(key);
}
public void delete(Integer index, String key) {
setDbIndex(index);
redisTemplate.delete(key);
}
/**
* Object转成JSON数据
*/
private String toJson(Object object) {
if (object instanceof Integer || object instanceof Long || object instanceof Float ||
object instanceof Double || object instanceof Boolean || object instanceof String) {
return String.valueOf(object);
}
return gson.toJson(object);
}
/**
* JSON数据,转成Object
*/
private <T> T fromJson(String json, Class<T> clazz) {
//T t = JSONObject.parseObject(json, clazz);
return gson.fromJson(json, clazz);
}
/**
* 设置数据库索引
* chens
*
* @param dbIndex 数据库索引
*/
private void setDbIndex(Integer dbIndex) {
// 边界判断
if (dbIndex == null || dbIndex > 15 || dbIndex < 0) {
dbIndex = database;
}
LettuceConnectionFactory redisConnectionFactory = (LettuceConnectionFactory) redisTemplate
.getConnectionFactory();
if (redisConnectionFactory == null) {
return;
}
redisConnectionFactory.setDatabase(dbIndex);
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 属性设置后
redisConnectionFactory.afterPropertiesSet();
// 重置连接
redisConnectionFactory.resetConnection();
}
}
来源:https://blog.csdn.net/weixin_51216079/article/details/125601477


猜你喜欢
- SpringMVC服务器验证一种是有两种方式,一种是基于Validator接口,一种是使用Annotaion JSR-303标准的验证,下面
- SpringBoot 中配置redis作为session 缓存器。 让shiro引用本文是建立在你是使用这shiro基础之上的补充内容第一种
- 动态方法就是一个Action对应多个请求,减少Action的数量1、指定method属性<action name="addA
- 有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些
- 本文实例讲述了C#精确计算年龄的方法。分享给大家供大家参考。具体如下:该源码在vs2010测试通过using System;using Sy
- 一、题目描述-批量重命名1、题目题目:在window操作系统中,支持对文件名重命名,但不支持批量重命名。实现:做一个批量重命名的工具。2、解
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- spring xml文件打开没有namespace等操作选项第一步查看自己安装的eclipse的正确的版本号:打开eclipse,点击hel
- 上一篇文章我们介绍了Apache Commons Math3学习之数值积分实例代码,这里给大家分享math3多项式曲线拟合的相关内容,具体如
- 创建started service 应用组件(例如Activity)
- 一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configur
- MyBatis在注解上使用动态SQL1、用script标签包围然后像xml语法一样书写@Select({"<script&g
- 之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置
- 本文实例为大家分享了Java实现银行ATM系统的具体代码,供大家参考,具体内容如下一、前言银行ATM系列简单操作二、使用步骤1.创建用户信息
- 引言:在Object基类中,有一个方法叫clone,产生一个前期对象的克隆,克隆对象是原对象的拷贝,由于引用类型的存在,有深克隆和浅克隆之分
- 最新对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。我这里使用窗体来做测试。1:二进制读写/// <summary>
- 先如今idea中的spring项目,springBoot的项目的开发一般都是基于maven创建的项目。这大大简化我我们对于各种依赖包的管理,
- 1.引言在实习期间,感受到在vs code上编程的优势(实习期间主要写的lua脚本),因此想把C++和python的开发也迁移到vs cod
- 一、IO流的分类字符流ReaderInputStreamReader(节点流)BufferedReader(处理流)WriterOutput
- 背景1> 大家都知道SpringBoot是通过main函数启动的,这里面跟踪代码到处都没有找到while(true),为什么启动后可以