SpringBoot结合Redis配置工具类实现动态切换库
作者:Coder-CT 时间:2022-04-15 14:14:13
我使用的版本是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
标签:SpringBoot,Redis,动态切换库
0
投稿
猜你喜欢
Qt QTableWidget基本操作及使用
2022-05-22 23:15:55
DevExpress设置饼状图的Lable位置实例
2022-02-02 15:53:37
Springboot分页插件使用实例解析
2023-03-29 21:29:57
Springboot2以代码的方式统一配置Jackson教程
2021-08-30 16:47:33
Android自定义开关按钮源码解析
2021-12-27 06:45:27
基于C#的图表控件库 ScottPlot编译visual studio 2022
2022-05-02 10:24:13
mybatisplus使用xml的示例详解
2021-08-21 18:19:27
dubbo如何实现consumer从多个group中调用指定group的provider
2022-06-09 01:00:13
Kafka Producer中的消息缓存模型图解详解
2022-05-03 06:00:13
解析Spring事件发布与监听机制
2022-09-01 09:52:19
Android中Service与Activity之间通信的几种方式
2023-10-11 15:40:16
android使用ItemDecoration给RecyclerView 添加水印
2022-01-17 19:42:54
Java持久化XML文件配置解析
2022-06-27 13:45:07
java后台利用Apache poi 生成excel文档提供前台下载示例
2023-05-15 08:51:45
SpringBoot中使用 RabbitMQ的教程详解
2023-10-22 01:02:42
C#4.0新特性之协变与逆变实例分析
2022-02-18 00:17:28
java和javascript中过滤掉img形式的字符串不显示图片的方法
2021-08-31 10:12:49
UnityShader使用Plane实现翻书效果
2022-05-19 14:46:14
Java封装的实现访问限定符、包
2023-03-20 07:08:48
android图片转换器示例
2022-02-16 14:27:01