Spring boot使用集群方式、支持ssl连接redis的方法

1、需求背景

 项目需要提供一个管理界面给内部人员操作用户信息,需要在修改用户信息后删除用户的redis缓存。用户所在的区域不同,其redis服务地址也不相同,因此需要管理多个redis连接,且redis要求以集群方式并支持ssl进行连接。

2、实现方案

 为每个区域定义一个regionId,用来关联不同区域的redis连接信息,将redis连接信息存于数据库中。采用工具类的方式,构建RedisTemplate对象存于以Map形式存于工具类中的静态变量当中,key为regionId,value为RedisTemplate。每个RedisTemplate构建时机为第一次需要用到它时。

3、具体实现

1、首先是存储redis信息的实体类

public class RedisInfo {private String regionId;private String ip;private int port;private String pwd;// 是否使用sslprivate boolean ssl;// 超时时间private long timeout;
}

2、其次是工具类的实现

public class RedisManage {private static Map<String, RedisTemplate<String, Object>> redisTemplateMap = new HashMap<>();/*** 获取RedisTemplate方法* @param redisInfo 数据库连接信息* @return*/public static RedisTemplate<String, Object> getRedisTemplate(RedisInfo redisInfo) {// 首先从map中获取RedisTemplate<String, Object> redisTemplate = redisTemplateMap.get(redisInfo.getRegionId());// 获取不到就构建一个并存入redisif (redisTemplate == null) {// redis连接配置RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();redisStandaloneConfiguration.setHostName(redisInfo.getIp());redisStandaloneConfiguration.setPort(redisInfo.getPort());redisStandaloneConfiguration.setPassword(RedisPassword.of(redisInfo.getPwd()));// 创建 LettuceClientConfiguration,用于构建LettuceConnectionFactoryLettuceClientConfiguration.LettuceClientConfigurationBuilder builder = LettuceClientConfiguration.builder().commandTimeout(Duration.ofMillis(redisInfo.getTimeout())).shutdownTimeout(Duration.ofMillis(redisInfo.getTimeout()));// 根据需要启用sslif (redisInfo.isSsl()) {builder.useSsl();}// 创建 LettuceConnectionFactory,集群连接的关键LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration, builder.build());// 重要,调用afterPropertiesSet才能正常使用factory.afterPropertiesSet();redisTemplate = new RedisTemplate();redisTemplate.setConnectionFactory(factory);// 将对象属性名序列化成string类型的key,并将string类型的key反序列化成属性名StringRedisSerializer keySerializer = new StringRedisSerializer();// 数据绑定工具,操作redis时需要对key和value进行序列化和反序列化,这个对象可以设置规范ObjectMapper mapper = new ObjectMapper();// 反序列化时遇到未知属性不抛出异常mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 序列化空bean时不抛出异常mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);// 反序列化时对象的成员变量与缓存中的对象类型对不上或代码中不存在该类时,不抛出异常mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);// 序列化时间字段时,以文本形式序列序列化而非时间戳mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);// 支持Java8的日期类型,如LocalDate、LocalTime、LocalDateTime等mapper.registerModule(new JavaTimeModule());// 序列化时保留对象类型信息mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);// 序列化和反序列化工具,使用jackson库将对象序列化成json字符串,并将json字符串反序列化成对象,应用了上面ObjectMapper的各项规范RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer(mapper);redisTemplate.setKeySerializer(keySerializer);redisTemplate.setValueSerializer((RedisSerializer)valueSerializer);redisTemplate.setHashKeySerializer(keySerializer);redisTemplate.setHashValueSerializer((RedisSerializer)valueSerializer);// 重要,非托管Spring容器构建的RedisTemplate需要调用afterPropertiesSet()方法redisTemplate.afterPropertiesSet();redisTemplateMap.put(redisInfo.getRegionId(), redisTemplate);}return redisTemplate;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt for android 获取USB设备列表(一)Java方式 获取

简介 QtActivity 作为 Qt 应用程序的入口点&#xff0c;负责启动和配置 Qt 应用程序的信息&#xff0c; 后面我们继承 QtActivity 做自定义控制&#xff0c;了解一下 Activity 生命周期概念&#xff0c; 因为 QtActivity 继承自Android的activity&#xff0c;使用周期函数完成我…

java8新特性——函数式编程详解

目录 一 概述1.1 背景1.2 函数式编程的意义1.3 函数式编程的发展 Lambda表达式1.1 介绍1.2 使用Lambda的好处1.3 Lambda方法1.3.1 Lambda表达式结构1.3.2 Lambda表达式的特征 1.4 Lambda的使用1.4.1 定义函数式接口1.4.2 Lambda表达式实现函数式接口1.4.3 简化Lambda表达式1.4.…

C++学习/复习4--与类相关的概念/默认成员函数/运算符重载/Date类实现案例

一、类和对象 1.本章概要 2.C中的结构体(struct与class) 升级为类 &#xff08;1&#xff09;类及成员函数的两种定义方式 声明与定义分离 &#xff08;2&#xff09;权限 注意1&#xff1a;struct/class在权限上的区别 &#xff08;3&#xff09;封装 &#xff08;4&#x…

AI学习指南数学工具篇-凸优化之对偶性与拉格朗日对偶

AI学习指南数学工具篇-凸优化之对偶性与拉格朗日对偶 在凸优化中&#xff0c;对偶性是一个非常重要的概念。通过对偶性&#xff0c;我们可以将原始问题转化为对偶问题&#xff0c;从而更容易求解。其中&#xff0c;拉格朗日对偶问题是对偶性的一个重要应用&#xff0c;通过拉格…

《Ai学习笔记》自然语言处理 (Natural Language Processing):机器阅读理解-基础概念解析01

自然语言处理 (Natural Language Processing)&#xff1a; NLP四大基本任务 序列标注&#xff1a; 分词、词性标注 分类任务&#xff1a; 文本分类、情感分析 句子关系&#xff1a;问答系统、对话系统 生成任务&#xff1a;机器翻译、文章摘要 机器阅读理解的定义 Machi…

LangChain - 建立代理

本文翻译整理自&#xff1a;Build an Agent https://python.langchain.com/v0.2/docs/tutorials/agents/ 文章目录 一、说明概念 二、定义工具1、TavilyAPI参考&#xff1a; 2、RetrieverAPI参考&#xff1a;API参考&#xff1a; 3、工具 三、使用语言模型四、创建代理五、运行…

《安富莱嵌入式周报》第337期:超高性能信号量测量,协议分析的开源工具且核心算法开源,工业安全应用的双通道数字I/O模组,低成本脑机接口,开源音频合成器

周报汇总地址&#xff1a;http://www.armbbs.cn/forum.php?modforumdisplay&fid12&filtertypeid&typeid104 视频版&#xff1a; https://link.zhihu.com/?targethttps%3A//www.bilibili.com/video/BV1PT421S7TR/ 《安富莱嵌入式周报》第337期&#xff1a;超高性…

【Spring Boot】分层开发 Web 应用程序(含实例)

分层开发 Web 应用程序 1.应用程序分层开发模式&#xff1a;MVC1.1 了解 MVC 模式1.2 MVC 和三层架构的关系 2.视图技术 Thymeleaf3.使用控制器3.1 常用注解3.1.1 Controller3.1.2 RestController3.1.3 RequestMapping3.1.4 PathVariable 3.2 将 URL 映射到方法3.3 在方法中使用…

用户数据报协议UDP实现可靠传输的思路

一、UDP协议的特点 按照报文来分割发送。不需要建立连接和维护连接。不需要接收确认。速度较快。不确保接收的顺序和发送顺序一样。 二、用UDP实现可靠通信的思路 (一)接收时发送一个确认报文 实现接收确认的机制。 (二)每个报文腾出空间放置序号 发送时设置序号&#xff0c…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好&#xff0c;我是jiaoxingk 本篇文章主要讲解如何安装虚拟机&#xff0c;并且在虚拟机中安装centos系统&#xff0c;让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前&#xff0c;我们先做虚拟机的介绍 虚拟机&#xff1a;通过软件虚拟出来的…

Docker拉取镜像报错:x509: certificate has expired or is not yet v..

太久没有使用docker进行镜像拉取&#xff0c;今天使用docker-compose拉取mongo发现报错&#xff08;如下图&#xff09;&#xff1a; 报错信息翻译&#xff1a;证书已过期或尚未有效。 解决办法&#xff1a; 1.一般都是证书问题或者系统时间问题导致&#xff0c;可以先执行 da…

用HAL库改写江科大的stm32入门例子-6-2 定时器外部时钟

实验目的&#xff1a; 熟悉外部时钟的应用。 实验步骤&#xff1a; 创建项目参照前面的文章&#xff0c;集成oled(没有oled,用uart串口传递也可以)选择外部时钟源时钟源参数设置编写代码&#xff1a; 5.1声明全局变量&#xff0c;如果发生定时器中断的时候&#xff0c;在回调…

SW 零件插入零件的重合配合

重合配合有时候会失效,可以先用距离配合代替,之后修改距离尽量接近

AI网络爬虫-自动获取百度实时热搜榜

工作任务和目标&#xff1a;自动获取百度实时热搜榜的标题和热搜指数 标题&#xff1a;<div class"c-single-text-ellipsis"> 东部战区台岛战巡演练模拟动画 <!--48--></div> <div class"hot-index_1Bl1a"> 4946724 </div> …

【bash】统计服务器信息脚本

起因 写一个bash脚本统计服务器的机器名、内网IP、CPU使用率、内存使用率、List{GPU使用率、显存} 脚本 #!/bin/bash# 主机名 hostname$(hostname) # 内网ip ip$(ip addr | grep inet | grep -v 127.0.0.1 | awk {print $2} | cut -d/ -f1) ip$(echo "$ip"|tr \n…

Excel表格在线解密:轻松解密密码,快速恢复数据

忘记了excel表格密码&#xff1f;教你简单两步走&#xff1a;具体步骤如下。首先&#xff0c;在百度搜索中键入“密码帝官网”。其次&#xff0c;点击“立即开始”&#xff0c;在用户中心上传表格文件即可找回密码。这种方法不用下载软件&#xff0c;操作简单易行&#xff0c;适…

【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化+完美使用

模版介绍 【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化完美使用 腾讯官方出品discuz论坛DIY的后台设置&#xff0c;功能齐全&#xff0c;论坛功能不亚于葫芦侠&#xff0c;自定义马甲&#xff0c;自定义认证&#xff0c;自定义广告&#xff0c;完全可以打造出自己想…

元本学堂是什么?杜旭东疑似再翻车!

杜旭东&#xff0c;1956年1月7日出生于中国北京市&#xff0c;毕业于解放军艺术学院&#xff0c;中国内地男演员、国家一级演员&#xff01; 2023年11月17日晚&#xff0c;杜旭东在其个人社交媒体上发布视频&#xff0c;就其以前给缅北电诈集团的白家成员录制庆生视频一事道歉…

C++11std::bind的简单使用

std::bind用来将可调用对象与其参数一起进行绑定&#xff0c;绑定后的结果可以用std::function&#xff08;可调用对象包装器&#xff09;进行保存&#xff0c;并延迟调用到任何我们需要的时候。 通俗来讲&#xff0c;它主要有两大作用&#xff1a; &#xff08;1&#xff09…