Spring Boot 3.3 【八】整合实现高可用 Redis 集群

一、引言

在当今快速发展的软件开发领域,系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。

首先,随着业务的不断发展,数据量呈爆炸式增长,单个 Redis 服务器往往难以满足存储和处理需求。Redis 7 集群通过将数据分布在多个节点上,实现了数据的 横向扩展,能够轻松应对大规模数据的存储和访问。

对于高并发的应用场景,性能是关键考量因素。Springboot 3 与 Redis 7 集群整合后,可以充分利用 Redis 的高性能缓存特性。Redis 以其快速的读写速度著称,能够极大地减少数据库的访问压力,提高系统的响应速度。例如,在电商平台中,商品信息、用户购物车等数据可以缓存到 Redis 集群中,当用户查询或操作这些数据时,直接从 Redis 中获取,响应时间可以从几百毫秒降低到几毫秒,大大提升用户体验。

可靠性方面,Redis 7 集群提供了高可用性。如果其中一个 Redis 节点出现故障,其他节点仍然可以继续提供服务,确保系统的稳定运行。在金融交易系统、在线游戏等对稳定性要求极高的场景中,这种高可用性至关重要。数据会在多个节点之间进行复制,即使某个节点发生故障,数据也不会丢失,保证了数据的一致性和可用性。

此外,Springboot 3 的强大框架特性与 Redis 7 集群的结合,使得开发人员能够更加便捷地进行开发和维护。Springboot 提供了简洁的配置和开发模式,而 Redis 7 集群则提供了高效的数据存储和访问方式,两者相辅相成,为开发高质量的应用程序奠定了坚实的基础。

二、准备工作

(一)Redis 集群安装,请参照下文链接:

CentOS 7 环境搭建 redis 最新版 7.4 分布式集群完整版详解

三、整合步骤

(一)依赖添加

在 Springboot 3 项目中,要整合 Redis 7 集群,首先需要在项目的pom.xml文件中添加必要的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(二)配置文件编写

接下来是编写 application.yml 文件,下面配置了 Redis 7 集群的节点、超时时间以及连接池的相关参数。

server:port=8080spring:application:name: redisdata:redis:password: 123456abccluster: timeout: 1000max-redirects: 3nodes: 192.168.117.128:7400,192.168.117.128:7401,192.168.117.129:7402,192.168.117.129:7403,192.168.117.131:7404,192.168.117.131:7405lettuce:pool:max-active: 8 # 连接池中的最大空闲连接max-wait: 500 # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 8 # 连接池最大连接数(使用负值表示没有限制)min-idle: 0 # 连接池中的最小空闲连接

(三)缓存工具类

这个缓存工具类可以更灵活地进行缓存操作,提供了设置和获取缓存的方法,并支持设置过期时间。

package com.jsglxx.redis;import java.util.concurrent.TimeUnit;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class CacheUtil {private final RedisTemplate<String, Object> redisTemplate;public CacheUtil(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}public void set(String key, Object value, long timeout, TimeUnit unit) {redisTemplate.opsForValue().set(key, value, timeout, unit);}public Object get(String key) {return redisTemplate.opsForValue().get(key);}
}
  • 缓存工具类 CacheUtil 通过构造函数注入 RedisTemplateset 方法用于设置缓存,接收键、值、过期时间和时间单位作为参数。get 方法用于获取缓存,根据键从 Redis 中获取对应的值。

(四)实体类

package com.jsglxx.redis.Entity;public class User {private Long id;private String name;public User() {super();// TODO Auto-generated constructor stub}public User(Long id, String name) {super();this.id = id;this.name = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

(五)Service 层

package com.jsglxx.redis.service;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import com.jsglxx.redis.Entity.User;@Service
public class UserService {private final RedisTemplate<String, Object> redisTemplate;public UserService(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}public void saveUser(User user) {redisTemplate.opsForValue().set("user:" + user.getId(), user);}public Object getUser(Long id) {return (User) redisTemplate.opsForValue().get("user:" + id);}
}
  • 这里通过构造函数注入 RedisTemplate,然后使用它的opsForValue()方法进行对值类型的操作。在saveUser方法中,将用户对象以键值对的形式存入 Redis,键为"user:" + user.getId(),值为用户对象。在getUser方法中,根据用户 ID 从 Redis 中获取对应的用户对象。

(六)Controller 层

package com.jsglxx.redis.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import com.jsglxx.redis.Entity.User;
import com.jsglxx.redis.service.UserService;@RestController
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@PostMapping("/users")public void saveUser(@RequestBody User user) {userService.saveUser(user);}@GetMapping("/users/{id}")public Object getUser(@PathVariable Long id) {return userService.getUser(id);}
}
  • UserController 提供了两个接口,/users 用于保存用户,/users/{id} 用于获取用户。
  • UserController 接收 UserService 的实例,通过 @PostMapping@GetMapping 注解定义了两个接口。在 saveUser 方法中,调用 userServicesaveUser 方法保存用户。在 getUser 方法中,调用 userServicegetUser 方法获取用户。

(七)配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));return template;}
}

四、测试保存用户接口(POST 请求)

  1. 选择 POST 请求方法。
  2. URL 输入栏中输入你的应用的地址加上 /usershttp://localhost:8080/users
  3. Headers 选项卡中,可以添加 Content-Typeapplication/json,表示请求体是 JSON 格式的数据。
  4. Body 选项卡中,选择 rawJSON 格式。
  5. 输入一个 JSON 对象来表示用户数据:
{"id":1,"name":"小明"
}
  1. 点击 Send 按钮发送请求。
    在这里插入图片描述

  2. 检查响应状态码,应该是 200 OK 表示请求成功,并且你的应用应该已经将用户数据保存到 Redis 中。
    在这里插入图片描述

五、测试获取用户接口(GET 请求)

  1. 选择 GET 请求方法。
  2. URL 输入栏中输入你的应用的地址加上 /users/{id},将 {id} 替换为你要查询的用户 ID,例如 http://localhost:8080/users/1

在这里插入图片描述
3. 点击 Send 按钮发送请求。
在这里插入图片描述

结束语

在本次探索中,我们成功地将 Spring Boot 3.3 与 Redis 7.4 进行了整合,实现了高效的缓存管理。通过利用 Redis 7.4 的强大功能和集群模式,我们为应用程序带来了显著的性能提升和高可用性保障。

如果觉得本文能够帮到您,请关注🌟、点赞👍、收藏📚,让这份美好延续下去!

🌟 对技术管理感兴趣 请关注下方 ⬇ 【 技术管理修行】
过来人的建议:学习技术的同时学一点管理小知识,您不升职谁升职!~~

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

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

相关文章

docker-harbor

目录 一、registry 二、harbor 1.部署 harbor 1.1部署Docker-Compose 1.2部署 Harbor 服务 1.3在其他客户端上传镜像 三、维护管理Harbor 1. 创建 Harbor 用户 2.添加项目成员 3. 在客户端上使用普通账户操作镜像 4. 查看日志 5. 修改 Harbor.cfg 配置文件 6. 移除…

给定数组找出出现次数超过数组长度一半的数

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&#xff1a;给定…

低代码开发工具与传统开发工具的性能对比

随着信息技术的不断发展&#xff0c;软件开发工具也在不断演进。低代码开发工具近年来逐渐兴起&#xff0c;与传统开发工具相比&#xff0c;它们在性能方面有着不同的特点。 低代码开发工具的特点 易用性高&#xff1a;低代码开发工具通常提供可视化的开发界面&#xff0c;用户…

【Python数据库操作】使用SQLite和MySQL进行数据存储和查询!

【Python数据库操作】使用SQLite和MySQL进行数据存储和查询&#xff01; 在现代应用程序中&#xff0c;数据存储与管理是至关重要的。Python为开发者提供了多种与数据库进行交互的方式&#xff0c;其中SQLite和MySQL是最常用的两种数据库。本文将深入探讨如何使用Python进行SQ…

ES6 Promise的用法

学习链接&#xff1a;ES6 Promise的用法&#xff0c;ES7 async/await异步处理同步化&#xff0c;异步处理进化史_哔哩哔哩_bilibili 一、同步与异步区别 1.JavaScript代码是单线程的程序&#xff0c;即通过一行一行代码顺序执行&#xff0c;即同步概念。 2.若处理一些简短、…

uploads-labs靶场刷题记录

Pass-01 尝试上传一句话木马 1.php: <?php eval($_POST[cmd]);?>发现设置了白名单且抓包没有记录&#xff0c;说明在前端进行的拦截&#xff08;可以禁用前端的JS从而绕过拦截&#xff0c;达到直接上传木马的目的&#xff09;。 将一句话木马文件加上.jpg后缀1.php.jp…

后端常用安全措施

一、限流 1.简介 限流就是限制流量&#xff0c;但这里的流量是一个比较笼统的概念。如果考虑各种不同的场景&#xff0c;限流是非常复杂的&#xff0c;而且和具体的业务规则密切相关 通过限流&#xff0c;可以控制服务请求的速率&#xff0c;从而提高系统应对突发大流量的能…

ElementPlus中时间选择器配置

看文档老是力不从心&#xff0c;感觉找不到自己想要的样式的选择器记录一下吧 <el-date-pickerv-model"group.timeLimit"type"datetimerange":default-time"DEFAULT_DATE_TIME"range-separator"-"start-placeholder"开始时间&…

计算机组成原理一句话

文章目录 计算机系统概述存储系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&#xff…

字符串(3)_二进制求和_高精度加法

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 字符串(3)_二进制求和_高精度加法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

2024 四川省大学生信息安全技术大赛 安恒杯 部分 WP

文章目录 一、前言二、MISCunzip-png拓展 第47张图片重要的文件 三、WEB四、CRYPTO五、REVERSE 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB外&#xff0c;其余附件均已打包完毕&#xff0c;在这里也是非常感谢师傅的附件支持&#xff01; 123网盘下载&#x…

最佳简历--JAVA程序员的项目经验如何写

小熊学Java全能学习+面试指南:https://www.javaxiaobear.cn 首先你要明确,你能干什么,包括你自己编写的专业技能,到底会不会,怎么运用到技术上的? 1、你能干什么? 你能干什么,其实就展现你的能力,这是简历中最重要的部分,你需要证明前面说的你会的东东; 这就有点…

三周精通FastAPI:1 第一步入门

FastAPI是一个非常棒的python web和api框架&#xff0c;准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程&#xff1a;教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用&#xff08;它们实际上是经过测试的 Python 文件&#x…

【前端】如何制作一个自己的网页(14)

当我们还需要对网页中的内容进行局部样式的修改。这时候&#xff0c;就需要用到HTML中的重要元素&#xff1a;span。 span是一个行内元素&#xff0c;可以对HTML文档中的内容进行局部布局。 如图&#xff0c;我们给标题和段落元素的部分内容设置了各种样式。 接下来&#xff0…

树上启发式合并(详解)

核心思想 借用了一个节点到根的路径上轻边个数不会超过logn条。 故重节点保留&#xff0c;轻节点删去&#xff0c;多重统计。 实际复杂度&#xff08;nlogn&#xff09; 例题 Lomsat gelral - 洛谷 AC 代码 #include<bits/stdc.h> #define int long long using na…

新型电力系统精细化时序模拟分析软件

一、背景意义 在“碳达峰碳中和”及“新型电力系统”战略引领下&#xff0c;新型电力系统电力电量平衡分析成为电力系统规划运行模拟仿真的必要环节。近年来&#xff0c;随着电网新能源渗透率逐渐提升&#xff0c;储能等灵活性调节资源大幅增加&#xff0c;传统的基于典型曲线…

qiankun 应用之间数据传递

qiankun 应用之间数据传递 全局共享 initGlobalState qiankun initGlobalState API 单击前往 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信&#xff0c;该实例有三个方法&#xff0c;分别是onGlobalStateChange、setGlobalState、of…

小巧设计,强大功能:探索SoC模块的多样化功能

LoRa-STM32WLE5模块基于ST的STM32WLE5芯片&#xff0c;采用LoRa调制&#xff0c;适用于超远程和超低功耗无线电解决方案。搭载高性能Arm Cortex-M4核心&#xff0c;频率高达48 MHz&#xff0c;支持256 KB闪存和64 KB运行内存&#xff0c;具备安全性增强功能。广泛应用于安防、智…

C++进阶之路:日期类的实现、const成员(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

ue5 扇形射线检测和鼠标拖拽物体

这里的NumTrace是要发射几根射线&#xff0c;Degrees Per Trace是每根射线之间的角度&#xff0c; 例如 要在角色面前实现一个180度的扇形射线检测&#xff0c;就需这两个变量乘起来等于180 TraceLength是射线的长度 下面是鼠标拖动物体逻辑&#xff0c;很简单 这里的Floor和…