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

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 的强大功能和集群模式,我们为应用程序带来了显著的性能提升和高可用性保障。

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

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

相关文章:

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

一、引言 在当今快速发展的软件开发领域&#xff0c;系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。 首先&#xff0c;随着业务的不断发展&#xff0c;数据量呈爆炸式增长&#xff0c;单个 Redis 服务器往往难以满足存储和处理需求。Red…...

循环控制结构穷举 同构数

说明 同构数是会出现在它的平方的右边的数。例如&#xff0c;5就是1个同构数。5的平方是25&#xff0c;25最右边的这个数是5自己。25也是一个同构数&#xff0c;比如25的平方是625&#xff0c;而625右边的数是25. 请编程输出1000以内正整数中所有的同构数。每行一个答案。 输…...

主机本地IP与公网IP以及虚拟机的适配器和WSL发行版的IP

在局域网内&#xff0c;如果你想要连接到同一网络中的另一台设备&#xff0c;建议使用 本地 IP 地址&#xff08;也称为局域网 IP 地址&#xff09;。这是因为本地 IP 地址是在局域网内分配给设备的&#xff0c;用于在同一网络中的设备之间进行通信。 使用本地 IP 地址的好处 …...

@MassageMapping和@SendTo注解详解

MessageMapping注解是Spring Framework中用于WebSocket消息处理的注解&#xff0c;它用于将特定的消息路径映射到处理器方法上。SendTo注解指定了相应消息应该被发送到的目的地路径。 一、WebSocket配置类&#xff1a; Configuration EnableWebSocketMessageBroker public cl…...

2.1_Linux发展与基础

Linux基础知识 Shell 命令执行环境&#xff1a; 命令提示符的组成&#xff1a;(用户名主机名)-[当前路径]权限提示符,例&#xff1a;&#xff08;kali㉿kali)-[~]$ ~ 表示所在目录为家目录:其中root用户的家目录是/root&#xff0c;普通用户的家目录在/home下 # 表示用户的权…...

c#子控件拖动父控件方法及父控件限在窗体内拖动

一、效果 拖放位置不超过窗体四边,超出后自动靠边停靠支持多子控件拖动指定控件拖放(含父控件或窗体)点击左上角logo弹出消息窗口(默认位置右下角)1.1 效果展示 1.2 关于MQTTnet(最新版v4.3.7.1207)实现在线客服功能,见下篇博文 https://github.com/dotnet/MQTTnet 网上…...

Redis --- 第八讲 --- 关于主从复制哨兵

主从复制的补充问题 从节点和主节点之间断开连接&#xff0c;有两种情况&#xff1a; 1、从节点和主节点断开连接 slaveof no one 命令。这个时候&#xff0c;从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。&#xff0c; 2、主节点挂了 这个时…...

【数据结构】时间和空间复杂度-Java

如何衡量算法的好坏 根据时间复杂度和空间复杂度来判断 比较项目时间复杂度空间复杂度定义衡量算法执行时间与问题规模之间的关系衡量算法在运行过程中所占用的额外存储空间与问题规模之间的关系表达方式通常用大O符号表示&#xff0c;如O&#xff08;n&#xff09;、O(n^2&am…...

tensorRT安装详解(linux与windows)

目录 tensorRT介绍 前置准备 安装cuda与cudnn linux windows cuda版本查看 下载安装包 linux安装 安装 安装验证 windows安装 安装 环境变量配置 安装验证 tensorRT介绍 有关tensorRT的介绍见 TensorRT简介-CSDN博客 前置准备 安装cuda与cudnn linux Linux下…...

MYSQL OPTIMIZE TABLE 命令重建表和索引

在 MySQL 中&#xff0c;OPTIMIZE TABLE 命令用于重建表和相关索引&#xff0c;以及回收未使用的空间。这个命令对于维护和优化数据库表的性能非常有用&#xff0c;特别是在进行了大量的数据删除操作之后。OPTIMIZE TABLE 可以减少数据文件的碎片化&#xff0c;确保数据存储更加…...

开发指南075-各种动画效果

方法一、使用动画GIF图标 方法二、使用vue-count-to import CountTo from vue-count-to components: { CountTo }, <count-to :start-val"0" :end-val"num" :duration"num>0?num:1" class"card-panel-num" /> 方法…...

使用 el-upload 如何做到发送一次请求上传多个文件

在使用 Element UI 的 el-upload 组件时&#xff0c;默认情况下每次选择文件都会触发一次上传请求。如果你需要一次性上传多个文件&#xff0c;而不是每个文件都触发一次请求&#xff0c;可以通过一些配置和代码处理来实现。 方法一&#xff1a;通过配置file-list&#xff08;…...

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…...

Linux LVS 通用命令行

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux操作系统的负载均衡技术&#xff0c;它通过网络负载均衡技术将客户端请求分发到多台实际服务器上&#xff0c;以提高系统的性能和可靠性。在LVS中&#xff0c;常用的命令行工具主要是ipvsadm&#xff0c;以及一…...

laravel .env环境变量原理

介绍 对于应用程序运行的环境来说&#xff0c;不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时&#xff0c;.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。 使…...

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…...

新时代AI桌宠:XGO Rider让你的办公室瞬间高大上

​ XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider&#xff0c;这款全球首创的轮腿式桌面AI机器人&#xff0c;正在悄然改变我们的办公环境。它不仅是一个高科技玩具&#xff0c;更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…...

matlab的resample函数

MATLAB中resample函数用法 - 知乎 (zhihu.com) 主要是经常忘记了重采样时哪个是原采样率&#xff0c;哪个是重采样后的采样率&#xff08;目标采样率&#xff09;。这里记录下&#xff0c;目标采样率在前面&#xff01;...

idea怎么取消自动打开项目

idea设置不自动打开项目 选择File>> Settings 选择Appearance & Behavior >> System Settings 去掉勾选的Reopen last project on startup...

蓄电池在线监测系统 各大UPS铅酸蓄电池监测 保障安全

蓄电池的不断普及&#xff0c;确实推动了蓄电池监控和管理技术的持续升级。蓄电池检测系统的研发为我们带来了诸多好处&#xff0c;这些好处主要体现在以下几个方面&#xff1a; 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

ffmpeg(三):处理原始数据命令

FFmpeg 可以直接处理原始音频和视频数据&#xff08;Raw PCM、YUV 等&#xff09;&#xff0c;常见场景包括&#xff1a; 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装&#xff08;如封装为 MP4、TS&#xff09; 处理原始 YUV 视频…...