spring boot 同一个redis 操作不同的库

1.下面是在Spring Boot中配置多个Redis数据库的几种方式:

1.1 配置如下
# application.yml
spring:redis:host: localhostport: 6379password: your_password# 连接池配置lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1mstimeout: 5000ms# 多个数据库配置database0:database: 0  # 默认库database1:database: 1  # 订单库database2:database: 2  # 用户库

2. Redis配置类

2.1代码如下
@Configuration
@EnableCaching
@Slf4j
public class RedisConfig {@Bean@Primarypublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {return createRedisTemplate(connectionFactory);}@Bean(name = "redisTemplate1")public RedisTemplate<String, Object> redisTemplate1(@Qualifier("redisConnectionFactory1") RedisConnectionFactory connectionFactory) {return createRedisTemplate(connectionFactory);}@Bean(name = "redisTemplate2")public RedisTemplate<String, Object> redisTemplate2(@Qualifier("redisConnectionFactory2") RedisConnectionFactory connectionFactory) {return createRedisTemplate(connectionFactory);}@Bean@Primarypublic RedisConnectionFactory redisConnectionFactory(@Value("${spring.redis.host}") String host,@Value("${spring.redis.port}") int port,@Value("${spring.redis.password}") String password,@Value("${spring.redis.database0.database}") int database) {return createConnectionFactory(host, port, password, database);}@Bean(name = "redisConnectionFactory1")public RedisConnectionFactory redisConnectionFactory1(@Value("${spring.redis.host}") String host,@Value("${spring.redis.port}") int port,@Value("${spring.redis.password}") String password,@Value("${spring.redis.database1.database}") int database) {return createConnectionFactory(host, port, password, database);}@Bean(name = "redisConnectionFactory2")public RedisConnectionFactory redisConnectionFactory2(@Value("${spring.redis.host}") String host,@Value("${spring.redis.port}") int port,@Value("${spring.redis.password}") String password,@Value("${spring.redis.database2.database}") int database) {return createConnectionFactory(host, port, password, database);}private RedisTemplate<String, Object> createRedisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 配置序列化器Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper mapper = new ObjectMapper();mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);mapper.registerModule(new JavaTimeModule());jsonSerializer.setObjectMapper(mapper);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(jsonSerializer);template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}private RedisConnectionFactory createConnectionFactory(String host, int port, String password, int database) {LettuceConnectionFactory factory = new LettuceConnectionFactory();factory.setHostName(host);factory.setPort(port);factory.setPassword(password);factory.setDatabase(database);// Lettuce连接池配置GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMinIdle(0);poolConfig.setMaxWaitMillis(-1);factory.afterPropertiesSet();return factory;}
}

3.Redis操作服务

3.1 代码如下
@Service
@Slf4j
public class RedisService {@Autowired@Qualifier("redisTemplate")  // 默认库private RedisTemplate<String, Object> redisTemplate;@Autowired@Qualifier("redisTemplate1")  // 订单库private RedisTemplate<String, Object> redisTemplate1;@Autowired@Qualifier("redisTemplate2")  // 用户库private RedisTemplate<String, Object> redisTemplate2;/*** 默认库操作*/public void setDefault(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);} catch (Exception e) {log.error("Redis默认库操作失败: key={}", key, e);throw new RuntimeException("Redis操作失败", e);}}/*** 订单库操作*/public void setOrder(String key, Object value) {try {redisTemplate1.opsForValue().set(key, value);} catch (Exception e) {log.error("Redis订单库操作失败: key={}", key, e);throw new RuntimeException("Redis操作失败", e);}}/*** 用户库操作*/public void setUser(String key, Object value) {try {redisTemplate2.opsForValue().set(key, value);} catch (Exception e) {log.error("Redis用户库操作失败: key={}", key, e);throw new RuntimeException("Redis操作失败", e);}}/*** 批量操作示例*/public void batchOperation() {try {// 使用管道批量处理redisTemplate.executePipelined(new SessionCallback<Object>() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {operations.opsForValue().set("key1", "value1");operations.opsForValue().set("key2", "value2");return null;}});redisTemplate1.executePipelined(new SessionCallback<Object>() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {operations.opsForValue().set("order1", "value1");operations.opsForValue().set("order2", "value2");return null;}});} catch (Exception e) {log.error("Redis批量操作失败", e);throw new RuntimeException("Redis操作失败", e);}}
}

4. 使用示例

4.1代码如下
@RestController
@RequestMapping("/api/redis")
@Slf4j
public class RedisController {@Autowiredprivate RedisService redisService;@PostMapping("/default")public ResponseEntity<?> setDefault(@RequestParam String key, @RequestParam String value) {try {redisService.setDefault(key, value);return ResponseEntity.ok().build();} catch (Exception e) {log.error("设置默认库失败", e);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("操作失败");}}@PostMapping("/order")public ResponseEntity<?> setOrder(@RequestParam String key, @RequestParam String value) {try {redisService.setOrder(key, value);return ResponseEntity.ok().build();} catch (Exception e) {log.error("设置订单库失败", e);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("操作失败");}}@PostMapping("/user")public ResponseEntity<?> setUser(@RequestParam String key, @RequestParam String value) {try {redisService.setUser(key, value);return ResponseEntity.ok().build();} catch (Exception e) {log.error("设置用户库失败", e);return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("操作失败");}}
}

5. 缓存配置(可选)

5.1 代码如下
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {// 创建多个缓存管理器Map<String, RedisCacheConfiguration> cacheConfigs = new HashMap<>();// 默认缓存配置cacheConfigs.put("default", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)));// 订单缓存配置cacheConfigs.put("order", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30)));// 用户缓存配置cacheConfigs.put("user", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(2)));return RedisCacheManager.builder(connectionFactory).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()).withInitialCacheConfigurations(cacheConfigs).build();}
}

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

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

相关文章

C语言面试题/笔试题/高频面试题_2

9. 全局变量和局部变量的区别 定义&#xff1a;全局变量是定义在函数外部的变量&#xff0c;局部变量是定义在 函数内部的变量 存储位置&#xff1a;全局变量存储在全局区&#xff0c;局部变量存储在栈区 作用域&#xff1a;全局变量可以在程序任意位置使用&#xff0c;局部变量…

Brain.js(八):RNNTimeStep 实战教程 - 股票价格预测 - 实操需警慎

前置声明&#xff0c;个人浅度炒股&#xff0c;但计划将基金转入股市。然后 股市有风险&#xff0c;不是技术可以完全预测的&#xff0c;但是在无头绪的时候&#xff0c;用技术指标做个参考也不错。 本文涉及到的股票预测&#xff0c;只是代码简单示例&#xff0c;实操需警慎&a…

MySQL | 尚硅谷 | 第13章_约束

MySQL笔记&#xff1a;第13章_约束 文章目录 MySQL笔记&#xff1a;第13章_约束第13章_约束 1. 约束(constraint)概述1.1 为什么需要约束1.2 什么是约束1.3 约束的分类演示代码 2. 非空约束2.1 作用2.2 关键字2.3 特点2.4 添加非空约束2.5 删除非空约束演示代码 3. 唯一性约束3…

《计算机网络》(408大题)

2009 路由转发和静态路由的计算 子网划分、路由聚合的计算 注&#xff1a;CIDR中的子网号可以全为0或1&#xff0c;但是其主机号不允许。 注&#xff1a; 这里其实是把到互联网的路由当做了一个默认路由&#xff08;当一个目的网络地址与路由表中其他都不匹配时&#xff0c;…

NanoLog起步笔记-6-StaticLogInfo

nonolog起步笔记-6-StaticLogInfo StaticLogInfo文件名和行号文件名和行号的传入log参数 RuntimeLogger::registerInvocationSitelogid为什么只能被赋一次值 reserveAlloc加入消息头finishAlloc返回 StaticLogInfo 写C语言编译前端时&#xff0c;给我印象深刻的一部分是&#…

软件工程 概述

软件 不仅仅是一个程序代码。程序是一个可执行的代码&#xff0c;它提供了一些计算的目的。 软件被认为是集合可执行的程序代码&#xff0c;相关库和文档的软件。当满足一个特定的要求&#xff0c;就被称为软件产品。 工程 是所有有关开发的产品&#xff0c;使用良好定义的&…

Sui 集成 Phantom,生态迎来全新里程碑

作为领先的非托管多链加密&#x1f45b;&#xff0c;Phantom 宣布将支持 Sui 区块链。Sui 将加入 Solana、Bitcoin 和 Ethereum 队伍&#xff0c;成为该 wallet 支持的少数 L1 区块链之一。 此次集成也大幅提升了 Phantom 的互操作性&#xff0c;同时表明 wallet 提供商和应用…

目标跟踪领域经典论文解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…

如何解决 java.nio.charset.CoderMalfunctionError: 编码器故障错误问题?亲测有效的解决方法!

java.nio.charset.CoderMalfunctionError 是一个在 Java 中相对较少遇到的异常&#xff0c;通常与字符编码转换过程中的错误有关。当 Java 程序在进行字符编码转换时&#xff0c;遇到无法处理的字符或编码故障时&#xff0c;就会抛出该异常。 1. 问题描述 java.nio.charset.C…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构&#xff08;HCIP-Cloud Service Solution Architect&#xff09;证书, 特意在淘宝上买了题库&#xff0c; 考过了。 事后得知自己被坑了&#xff0c; 多花了几十大洋。 所以想着在授权期内将题库“爬”下来&#xff0c; 共享给大家。 因为整个过程蛮有…

QGroundControl之5-AppSettings.cc

介绍 应用程序设置 Application Settings &#xff0c;这里看下语言选择功能&#xff0c;它是怎么和json文件关联起来的&#xff0c;刚刚看的时候&#xff0c;很是奇怪这么多的json文件作用。 1.AppSettings.cc 文件怎么和App.SettingsGroup.json关联 在AppSettings.cc文件没…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…

【ArcGIS微课1000例】0134:ArcGIS Earth实现二维建筑物的三维完美显示

文章目录 一、加载数据二、三维显示三、三维符号化一、加载数据 加载配套实验数据(0134.rar中的建筑物,2d或3d都可以),方法如下:点击添加按钮。 点击【Add Files】,在弹出的Open对话框中,选择建筑物,点击确定,完成添加。 默认二维显示: 二、三维显示 右键建筑物图层…

jupyterlab 增加多个kernel,正确做法

1、背景 需要增加一个kernel然后相当于隔离一个环境 juypterlab Version 3.0.14 2、用conda 安装 例如&#xff0c;你在conda下有一个python 3.12 的环境 py312 ipython kernel install --user --namepy312 如果保持的话&#xff0c;用pip安装相应的包就好 3、检查是否配置好 …

案例-商品列表(组件封装)

标签组件封装 1.双击显示&#xff0c;自动聚焦 2.失去焦点&#xff0c;隐藏输入框 标签一列&#xff0c;不同行的标签内容不同&#xff0c;但是除此之外其他基本一致&#xff0c;所以选择用 标签组件 将这一部分封装为一个组件&#xff0c;需要时组件标签展示。 首先标签处一进…

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号&#xff0c;还有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一个注释…

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存在CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…

【Android Studio】学习——网络连接

实验&#xff1a;Android网络连接 文章目录 实验&#xff1a;Android网络连接[toc]实验目标和实验内容&#xff1a;1、掌握Android联网的基本概念&#xff1b;2、能够使用URL connection实现网络连接&#xff1b;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…

ROS学习笔记二:ROS环境搭建

安装ubuntu安装ROS 参考赵虚左老师教程&#xff1a;ROS安装ROS 快速上手体验 -使用命令来实现 –创建工作空间&#xff1a; mkdir -p ros_learn_ws/src// ros_learn_ws为自定义空间 cd ros_learn_ws catkin_make –创建ROS功能包并添加依赖 cd src catkin_create_pkg demo_01 r…

5G中什么是ATG网络?

有人问Air to Ground Networks for NR是怎么回事&#xff1f;这个是R18 NR才引入的。 ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;ATG可以工作在N1/N3/N34/N39…