SpringBoot Redis动态切换库
Coder-CT 人气:0我使用的版本是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(); } }
加载全部内容