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

Spring Boot 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=8080
  
spring:
  application:
    name: redis
  data:
    redis:
      password: 123456abc
      cluster: 
        timeout: 1000
        max-redirects: 3
        nodes: 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:7405
      lettuce:
        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 {

    @Bean
    public 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.kler.cn/a/470440.html

相关文章:

  • 免费一键图片转3D模型,AI建模,一键把图片转三维模型,二维图片转3维模型,AI建模
  • Elasticsearch:优化的标量量化 - 更好的二进制量化
  • Go语言的数据库交互
  • 【Linux】文件的压缩与解压
  • touch详讲
  • Functions
  • uniapp本地加载腾讯X5浏览器内核插件
  • TCP 如何获取端口信息
  • NLP项目实战——基于Bert模型的多情感评论分类(附数据集和源码)
  • go如何从入门进阶到高级
  • 【网络】ARP表、MAC表、路由表
  • 【Linux知识】Linux防火墙介绍
  • 【PtpBasics】- KRTS C++示例精讲(7)
  • docker中使用Volume完成数据共享
  • ESP32物联网无线方案,智能穿戴设备联网通信,产品无线交互应用
  • 从入门到精通:Ansible Shell 模块的应用与最佳实践
  • 智慧工地解决方案深度解析:统一架构平台,十大产品线与AI+智慧工地产品趋势
  • 微服务中任务失败后如何进行重试
  • 嵌入式硬件设计的基本流程
  • 从git分支获取一个新项目
  • Swift Concurrency(并发)学习
  • 在环境冲突情况下调整优先级以解决ROS Catkin构建中缺少模块的问题【ubuntu20.04】
  • Outlook 网页版一直提示:检测到重复的重定向
  • Selenium 的四种等待方式及使用场景
  • C# 检查一个字符串是否是科学计数法格式字符串 如 1.229266E+01
  • Requests聚焦爬虫-数据解析