当前位置: 首页 > 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; 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...