当前位置: 首页 > news >正文

Redis - 多数据源切换

问题描述

最近遇到一个 Redis 多数据源切换问题,不过我这个没有那么动态切换需求,所以就写了一种比较硬编码的方式来做『切换』

其实大概的场景是这样的:不同的开发环境调用 db0、生产环境调用 db1,但是因为业务原因,当中有一部分的业务需要共享数据(中心数据),所以想把 db15 当作他们的共享数据库。

原因分析

思路很简单,只要生产 2 个 RedisTemplate 即可:

  1. 调用默认的 db RedisTemplate
  2. 调用共享的 db RedisTemplate

解决方案

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
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.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
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.GenericToStringSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
import java.time.Duration;/*** @author Lux Sun* @date 2020/5/9*/
@Slf4j
@Configuration
public class RedisConfig {@Resourceprivate JedisConnectionFactory jedisConnectionFactory;@Beanpublic RedisTemplate<String, Object> comnRedisObjectTemplate(@Value("${spring.redis.host}") String host,@Value("${spring.redis.port}") int port) {RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();redisConfig.setHostName(host);redisConfig.setPort(port);// 指定 database 15redisConfig.setDatabase(15);GenericObjectPoolConfig config = new GenericObjectPoolConfig();JedisClientConfiguration clientConfiguration = JedisClientConfiguration.builder().usePooling().build();JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisConfig, clientConfiguration);RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(jedisConnectionFactory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);serializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(serializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}@Beanpublic RedisTemplate<String, Object> redisObjectTemplate() {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(jedisConnectionFactory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);serializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(serializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}
}
http://www.lryc.cn/news/250903.html

相关文章:

  • 采集工具-免费采集器下载
  • 使用MD5当做文件的唯一标识,这样安全么?
  • 【算法通关村】链表基础经典问题解析
  • 【华为OD题库-056】矩阵元素的边界值-java
  • zabbix_sender——向zabbix交互的sdk
  • JDBC概述(什么是JDBC?JDBC的原理、Mysql和Sql Server入门JDBC操作)
  • 【android开发-06】android中textview,button和edittext控件的用法介绍
  • 【JMeter】BeanShell了解基础知识
  • Unity | 渡鸦避难所-0 | 创建 URP 项目并导入商店资源
  • SQL Server数据库部署
  • YOLOv8界面-目标检测+语义分割+追踪+姿态识别(姿态估计)+界面DeepSort/ByteTrack-PyQt-GUI
  • MiniDumpWriteDump函数生成dmp文件
  • 【Qt开发流程】之事件系统1:事件系统描述及事件发生流程
  • 初始数据结构(加深对旋转的理解)
  • Android 13 - Media框架(18)- CodecBase
  • 关于微信公众号授权的几件事
  • Docker监控Weave Scope的安装和使用
  • 为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)
  • 代币化:2024年的金融浪潮预示着什么?
  • [学习记录]Node event loop 总结流程图
  • 【LeetCode热题100】【双指针】移动零
  • Mybatis 分页查询的三种实现
  • 各类声音数据集大合集—乐器、车辆、鸟鸣、蜜蜂声音、歌曲、喇叭、人类声音不同等类型的声音数据集
  • java设计模式学习之【原型模式】
  • 链表数组插入排序
  • MyBatis的创建,简单易懂的一篇blog
  • MOS管的静电击穿问题
  • 在线 SQL 模拟器SQL Fiddle使用简介
  • 仿京东淘宝商品列表筛选组件:实现一个高效的侧边栏弹框筛选功能
  • 软件工程 - 第8章 面向对象建模 - 4 - 物理体系结构建模