springboot 配置多个Redis数据源详解
实现原理
- 需要配置好两个数据源,创建两个RedisTemplate
- 在配置类中注入两个RedisConnectionFactory,分别创建对应的RedisTemplate进行操作
详解
配置数据源
我这里是在之前已有一个配置下面另外加了一个
spring:redis:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password: xxxx# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms#第二数据源second:host: 127.0.0.1port: 6379password: xxx
创建配置文件
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
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.jedis.JedisConnectionFactory;@Configuration
public class RedisConfigs {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.second.host}")private String secondHost;@Value("${spring.redis.second.port}")private int secondPort;@Value("${spring.redis.second.password}")private String secondPassword;@Bean(name = "redisConnectionFactory")@Primary //默认选择这个数据源进行执行@Qualifier("redisConnectionFactory")public RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName(host);config.setPort(port);config.setPassword(RedisPassword.of(password));return new JedisConnectionFactory(config);}@Bean(name = "secondRedisConnectionFactory")@Qualifier("secondRedisConnectionFactory")public RedisConnectionFactory secondRedisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName(secondHost);config.setPort(port);config.setPassword(RedisPassword.of(secondPassword));return new JedisConnectionFactory(config);}}
创建工具类
注入配置类中的RedisConnectionFactory分别生成对应的RedisTemplate,然后进行操作就可以啦
import com.bdtd.limit.common.config.FastJson2JsonRedisSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public class RedisUtil {private final RedisConnectionFactory redisConnectionFactory;private final RedisConnectionFactory secondRedisConnectionFactory;@Autowiredpublic RedisUtil(RedisConnectionFactory redisConnectionFactory,@Qualifier("secondRedisConnectionFactory")RedisConnectionFactory secondRedisConnectionFactory) {this.redisConnectionFactory = redisConnectionFactory;this.secondRedisConnectionFactory = secondRedisConnectionFactory;}public RedisTemplate<String, Object> getRedisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(serializer);redisTemplate.afterPropertiesSet();return redisTemplate;}public RedisTemplate<String, Object> getSecondRedisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(secondRedisConnectionFactory);FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(serializer);redisTemplate.afterPropertiesSet();return redisTemplate;}/*** 第一数据源* 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值*/public <T> void setCacheObject(final String key, final T value){getRedisTemplate().opsForValue().set(key, value);}/*** 第一数据源* 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值* @param timeout 时间* @param timeUnit 时间颗粒度*/public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){getRedisTemplate().opsForValue().set(key, value, timeout, timeUnit);}/*** 第一数据源* 设置有效时间** @param key Redis键* @param timeout 超时时间* @param unit 时间单位* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout, final TimeUnit unit){return getRedisTemplate().expire(key, timeout, unit);}/*** 第一数据源* 判断 key是否存在** @param key 键* @return true 存在 false不存在*/public Boolean hasKey(String key){return getRedisTemplate().hasKey(key);}/*** 第一数据源* 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public Object getCacheObject(final String key){ValueOperations<String, Object> operation = getRedisTemplate().opsForValue();return operation.get(key);}/*** 第一数据源* 删除单个对象** @param key*/public boolean deleteObject(final String key){return getRedisTemplate().delete(key);}/*** 第一数据源* 删除集合对象** @param collection 多个对象* @return*/public boolean deleteObject(final Collection collection){return getRedisTemplate().delete(collection) > 0;}/*** 第一数据源* 缓存List数据** @param key 缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setCacheList(final String key, final List<T> dataList){Long count = getRedisTemplate().opsForList().rightPushAll(key, dataList);return count == null ? 0 : count;}/*** 第一数据源* 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public <T> List<T> getCacheList(final String key){return (List<T>) getRedisTemplate().opsForList().range(key, 0, -1);}/*** 第一数据源* 缓存Map** @param key* @param dataMap*/public <T> void setCacheMap(final String key, final Map<String, T> dataMap){if (dataMap != null) {getRedisTemplate().opsForHash().putAll(key, dataMap);}}/*** 第一数据源* 获得缓存的Map** @param key* @return*/public <T> Map<Object, Object> getCacheMap(final String key){return getRedisTemplate().opsForHash().entries(key);}/*** 第二数据源* 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值*/public <T> void setSencondCacheObject(final String key, final T value){getSecondRedisTemplate().opsForValue().set(key, value);}/*** 第二数据源* 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值* @param timeout 时间* @param timeUnit 时间颗粒度*/public <T> void setSencondCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){getSecondRedisTemplate().opsForValue().set(key, value, timeout, timeUnit);}/*** 第二数据源* 设置有效时间** @param key Redis键* @param timeout 超时时间* @param unit 时间单位* @return true=设置成功;false=设置失败*/public boolean sencondExpire(final String key, final long timeout, final TimeUnit unit){return getSecondRedisTemplate().expire(key, timeout, unit);}/*** 第二数据源* 判断 key是否存在** @param key 键* @return true 存在 false不存在*/public Boolean sencondHasKey(String key){return getSecondRedisTemplate().hasKey(key);}/*** 第二数据源* 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public Object getSencondCacheObject(final String key){ValueOperations<String, Object> operation = getSecondRedisTemplate().opsForValue();return operation.get(key);}/*** 第一数据源* 删除单个对象** @param key*/public boolean deleteSencondObject(final String key){return getSecondRedisTemplate().delete(key);}/*** 第二数据源* 删除集合对象** @param collection 多个对象* @return*/public boolean deleteSencondObject(final Collection collection){return getSecondRedisTemplate().delete(collection) > 0;}/*** 第二数据源* 缓存List数据** @param key 缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setSencondCacheList(final String key, final List<T> dataList){Long count = getSecondRedisTemplate().opsForList().rightPushAll(key, dataList);return count == null ? 0 : count;}/*** 第二数据源* 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public <T> List<T> getSencondCacheList(final String key){return (List<T>) getSecondRedisTemplate().opsForList().range(key, 0, -1);}/*** 第二数据源* 缓存Map** @param key* @param dataMap*/public <T> void setSencondCacheMap(final String key, final Map<String, T> dataMap){if (dataMap != null) {getSecondRedisTemplate().opsForHash().putAll(key, dataMap);}}/*** 第二数据源* 获得缓存的Map** @param key* @return*/public <T> Map<Object, Object> getSencondCacheMap(final String key){return getSecondRedisTemplate().opsForHash().entries(key);}}
Redis使用FastJson序列化
import java.nio.charset.Charset;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;/*** Redis使用FastJson序列化* */
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
{public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");private Class<T> clazz;public FastJson2JsonRedisSerializer(Class<T> clazz){super();this.clazz = clazz;}@Overridepublic byte[] serialize(T t) throws SerializationException{if (t == null){return new byte[0];}return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);}@Overridepublic T deserialize(byte[] bytes) throws SerializationException{if (bytes == null || bytes.length <= 0){return null;}String str = new String(bytes, DEFAULT_CHARSET);return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);}
}相关文章:
springboot 配置多个Redis数据源详解
实现原理 需要配置好两个数据源,创建两个RedisTemplate在配置类中注入两个RedisConnectionFactory,分别创建对应的RedisTemplate进行操作 详解 配置数据源 我这里是在之前已有一个配置下面另外加了一个 spring:redis:# 地址host: localh…...
【数据结构】排序算法总结
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 总结 1. 归并排序2. 计数排序3. 排序…...
作为20年老程序员,我如何使用GPT4来帮我写代码
如果你还在用google寻找解决代码bug的方案,那你真的out了,试试gpt4, save my life. 不是小编危言耸听,最近用gpt4来写代码极大地提高了代码生产力和运行效率,今天特地跟大家分享一下。 https://www.promptspower.comhttps://www.…...
【机器学习合集】模型设计之残差网络 ->(个人学习记录笔记)
文章目录 模型设计之残差网络1. 什么是残差结构1.1 网络加深遇到的优化问题1.2 short connect技术 2. 残差网络及有效性理解2.1 残差网络 3. 残差网络的发展3.1 密集残差网络3.2 更宽的残差网络(wide resnet)3.3 分组残差网络3.4 Dual Path Network3.5 加权残差网络3.6 预激活残…...
GoLong的学习之路(十六)基础工具之Gin框架
Gin框架介绍及使用,这张不用看内容就知道非常重要,重要到什么地步呢?重要到开发java不会Spring全家桶这种概念。 上几篇文章写的是如何构建骨架,经脉。这一章是将血肉注入。 文章目录 Gin框架RESTful API Gin渲染HTML渲染静态文件…...
VMware打开centos黑屏解决方法汇总
VMware打开centos黑屏解决方法汇总 前言:一. VMware打开centos黑屏解决方法汇总一 .情况情况一:情况二情况三 二. 解决方法最简单的方法:一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…...
5G物联网关相较有线网关有哪些独特优势
5G为产业物联网应用带来了质的飞跃,5G技术实现更高速率、更低延迟和更大带宽,使得物联网能够接入更多数量的设备,实现更稳定、高效的连接和数据传输,在提高生产效率的同时,也进一步促进了物联网的应用发展和升级。 针对…...
【数据结构】顺序表的学习
前言:在之前我们学习了C语言的各种各样的语法,因此我们今天开始学习数据结构这一个模块,因此我们就从第一个部分来开始学习"顺序表"。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:C程序设计谭浩强版本…...
在NISQ小型计算机上执行大型并行量子计算的可能性
简介 Steve White提出了密度矩阵重整化群(DMRG)的基本思想,即纠缠是一种有价值的资源,可以用来精确或近似地描述大量子系统。后来,这一思想被理解为优化矩阵积状态(MPS)的算法,支持…...
考虑时空相关性的风电功率预测误差MATLAB代码
微❤关注“电气仔推送”获得资料(专享优惠) 风电功率预测置信区间误差分析拟合 1.风电功率预测误差--时空相关性 展示第一一个时间段的风电功率预测与实际风电功率值的比较。填充区域表示预测的不确定性,显示了95%置信区间内预测可能的范围…...
ASP.NET WebApi 极简依赖注入
文章目录 环境服务类启动项注入使用依赖注入的优点 环境 .NET Core 7.0ASP.NET CoreVisual Studio 2022 服务类 public class T_TempService {public T_TempService(){}public void Test(){}}启动项注入 #region 依赖注入 builder.Services.AddTransient<T_TempService&g…...
解决proteus仿真stm32,IIC通讯,IIC DEBUG无法显示从机应答信号的问题(问题情况为在8位数据后应答位显示?)
1、错误现象 错误现象如下,在IIC数据传输8位数据后,IIC DEBUG的应答位无法显示应答位 2、错误原因 我们打开信号传输的示波器,直接去查看IIC从机校验位的数据波形,可以看到从机示波器显示的的波形为半高ACK,那错误原…...
PHP判断闰年
闰年的规则 1.能被4整除且不能被100整除 (普通闰年) 2.能被400整除,公历年份是整百数的,必须是400的倍数才是闰年(世纪闰年) 代码 function isLeapYear($year) {if($year%40 && $year%100!0){r…...
证照之星XE专业版下载专业证件照制作工具
值得肯定的是智能背景替换功能,轻松解决背景处理这一世界难题。不得不提及的是新增打印字体设置,包含字体选择、字号大小、字体颜色等。不同领域的应用证明了万能制作,系统支持自定义证照规格,并预设了17种常用的证件照规格。人所…...
VR全景图片如何制作?揭秘VR全景图片制作全流程
引言: VR全景图片是一种以全景视角为基础的图片制作技术,能够呈现出更为真实、立体的视觉体验。通过VR全景图片,观众可以360环顾四周,仿佛身临其境,提供了一种全新的感官体验,那么如何制作出令人满意的全景…...
vue element el-table-column 循环示例代码
如果你想循环生成多个el-table-column,可以使用v-for指令。以下是一个示例: <template><el-table :data"tableData"><el-table-column v-for"column in columns" :key"column.prop" :label"column.l…...
R语言生物群落(生态)数据统计分析与绘图实践技术应用
R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线,通过多个来自经典…...
有了 GPT,还需要付费咨询吗?
之前写过一篇文章《在创业公司,我靠它续命 …》,提到现在写代码基本靠 GPT。现在这种状况不仅没有改变,反而依赖更深。公司立项开发产品的 Linux 版本,全靠我一个人。我之前虽然一直使用 Linux 开发环境,对 Linux 系统…...
如何搭建一台服务器?
一.准备工作 1. 确定服务器类型:根据需求选择适合的服务器类型,如网站服务器、数据库服务器、文件服务器等。 2. 选择操作系统:根据服务器类型选择合适的操作系统,如Linux(如Ubuntu、CentOS)、Windows Se…...
[转载]C++序列化框架介绍和对比
Google Protocol Buffers Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。 Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 XML 来说&…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
