Spring Boot 整合 Redis 步骤详解

文章目录

  • 1. 引言
  • 2. 添加依赖
  • 3. 配置 Redis 连接信息
  • 4. 创建 Redis 操作服务类
  • 5. 使用 RedisTemplate 或 ReactiveRedisTemplate
  • 6. 测试 Redis 功能
  • 7. 注意事项
  • 8. 总结

Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot 结合使用可以极大提升应用的性能和响应速度。本文将详细介绍如何在 Spring Boot 应用中整合 Redis,并通过示例代码展示具体实现步骤。

1. 引言

随着互联网应用对快速读写数据的需求日益增长,传统的数据库已经难以满足某些特定场景下的性能要求。Redis 凭借其内存级的数据访问速度、丰富的数据结构支持以及简单易用的 API,成为了许多开发者的首选。接下来,我们将一步步介绍如何在 Spring Boot 中集成 Redis。

2. 添加依赖

首先,在 pom.xml 文件中添加 Spring Data Redis 和 Jedis(或 Lettuce)客户端的 Maven 依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot Starter for Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><!-- Jedis or Lettuce client --><!-- Choose one of the following two dependencies --><!-- For Jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!-- Or for Lettuce --><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></dependency>
</dependencies>

3. 配置 Redis 连接信息

接下来,在 application.properties 或 application.yml 文件中配置 Redis 的连接参数。这里以 .yml 文件为例:

server:port: 8082
spring:data:redis:host: localhostport: 6379password: 123456

4. 创建 Redis 操作服务类

Java实体

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Description* @Author HaleyHu* @Date 2024/12/5 23:41*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Long id;private String username;private int age;
}

用户接口类

import org.hbin.redis.entity.User;/*** @Description* @Author HaleyHu* @Date 2024/12/5 23:44*/
public interface UserService {User query(Long id);Boolean expired(Long id);
}

接口实现类

import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.hbin.redis.entity.User;
import org.hbin.redis.service.UserService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;/*** @Description* @Author HaleyHu* @Date 2024/12/5 23:46*/
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {private final RedisTemplate<String, String> redisTemplate;private final String REDIS_PREFIX_KEY = "User::";@Overridepublic User query(Long id) {Object obj = redisTemplate.opsForValue().get("User::" + id);if(obj != null) {return JSON.parseObject(obj.toString(), User.class);}// 模拟从DB查询User user = new User(id, "user" + id, 20);redisTemplate.opsForValue().set(REDIS_PREFIX_KEY + id, JSON.toJSONString(user));return user;}@Overridepublic Boolean expired(Long id) {return redisTemplate.delete(REDIS_PREFIX_KEY + id);}
}

Controller代码

import lombok.RequiredArgsConstructor;
import org.hbin.redis.entity.User;
import org.hbin.redis.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @Description* @Author HaleyHu* @Date 2024/12/5 23:46*/
@RequiredArgsConstructor
@RestController
public class UserController {private final UserService userService;@GetMapping("/query")public User query(@RequestParam Long id) {return userService.query(id);}@GetMapping("/expired")public String expired(@RequestParam Long id) {return userService.expired(id).toString();}
}

如果你想处理更复杂的数据类型(如对象),则需要使用 RedisTemplate 并配置序列化器。例如,使用 Jackson JSON 序列化器:

import com.fasterxml.jackson.databind.ObjectMapper;
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 factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();serializer.setObjectMapper(objectMapper);template.setValueSerializer(serializer);template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}
}

5. 使用 RedisTemplate 或 ReactiveRedisTemplate

Spring Data Redis 提供了两种主要的方式来与 Redis 进行交互:同步方式 (RedisTemplate) 和响应式编程方式 (ReactiveRedisTemplate)。根据你的需求选择合适的方式。

同步方式 (RedisTemplate)
这是最常见的方式,适用于大多数应用场景。

响应式编程方式 (ReactiveRedisTemplate)
如果你的应用采用了响应式编程模型(如 WebFlux),那么 ReactiveRedisTemplate 可能更适合你。它允许你以非阻塞的方式与 Redis 进行通信。

6. 测试 Redis 功能

最后,我们可以通过编写单元测试来验证 Redis 的基本功能是否正常工作。也可以部署运行上述程序来验证。访问路径:
http://localhost:8082/query?id=1
http://localhost:8082/expired?id=1
在这里插入图片描述
在这里插入图片描述

7. 注意事项

  • 生产环境配置:在生产环境中部署时,请确保正确配置 Redis 的安全设置(如密码保护、网络限制等),并考虑启用持久化选项以防止数据丢失。
  • 性能优化:合理调整连接池参数,避免过多的连接消耗资源;同时也可以根据业务特点选用合适的序列化器来提高性能。
  • 监控和维护:定期检查 Redis 的运行状态,及时清理过期数据,保持系统的稳定性和高效性。

8. 总结

通过上述步骤,我们成功地在 Spring Boot 应用中集成了 Redis,并实现了基本的数据缓存功能。这不仅提高了应用的性能,还为开发者提供了更多灵活的数据管理手段。

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

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

相关文章

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

C++ 在2D与3D游戏的开发库

在当今的游戏开发领域,C++以其高效性、灵活性和强大的性能成为众多开发者首选的语言之一。 C++游戏库流行程度排行榜单 Unreal Engine - 因其全面的功能集和易用性成为最受欢迎的3D引擎之一。Cocos2d-x - 在移动2D游戏开发领域占据重要位置,因其高效性能和易用性而备受推崇…

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中&#xff0c;开发人员可能不想使用Service提供的负载均衡功能&#xff0c;而希望自己来控制负载均衡策略&#xff0c;针对这种情况&#xff0c;kubernetes提供了HeadLiness Service&#xff0c;这类Service不会分配Cluster IP&#xff0c;…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c) npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…

【Leetcode 热题 100】763. 划分字母区间

问题背景 给你一个字符串 s s s。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s s s。 返回一个表示每个字符串片段的长度的…

ChatGPT是强人工智能吗?

ChatGPT是强人工智能吗? 本文从人工智能发展的三个阶段的角度,分析当前强大的AI大模型所处的阶段,并通过对比各阶段的定义,明确各阶段的特点和未来发展方向; Narrow AI&#xff08;弱人工智能&#xff09;、AGI&#xff08;人工通用智能&#xff09;和 ASI&#xff08;人工超级…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能

在当下互联网技术飞速发展的浪潮中&#xff0c;Nginx 凭借其轻量级、高性能的特性&#xff0c;在 Web 服务器和反向代理服务器领域脱颖而出&#xff0c;成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源&#xff0c;在负载均衡、反向代理等方面也表现出色。然而…

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录

本人出现该问题的环境是xampp&#xff0c;异常关机&#xff0c;再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前&#xff0c;先备份数据&#xff0c;将mysql目录下的data拷贝到其他地方&#xff0c;这很重要。 然后开始折腾。 查资料&#xff0c;会发现很多…

MySQL日期时间函数详解

简介 本文主要讲解MySQL中的日期时间函数&#xff0c;包括&#xff1a;NOW、CURRENT_TIMESTAMP、CURDATE、CURRENT_DATE、CURTIME、CURRENT_TIME、STR_TO_DATE、DATE_FORMAT、TIME_FORMAT、DATE、TIME、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、QUARTER、YEARWEEK、WEEKDAY、…

ChatGPT 写作系列

ChatGPT 辅助写作 | 专栏 1 写作核心​ 先讲一下 ChatGPT 写作的核心。核心就是需要有文章大纲&#xff0c;而且文章大纲要足够细致。​ 具体怎么做呢&#xff1f;​ 提前准备多级标题大纲&#xff0c;刚开始有两个级别的标题就行&#xff0c;等用熟练了再细化。分一级标题&…

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …

【Java】Java抛异常到用户界面公共封装

前言 在Java中处理代码运行异常是常见的技术点之一&#xff0c;我们大部分会使用封装的技巧将异常进行格式化输出&#xff0c;方便反馈给用户界面&#xff0c;也是为了代码复用 看看这行代码是怎么处理异常的 CommonExceptionType.SimpleException.throwEx("用户信息不…

mkv转码mp4(ffmpeg工具)

基于windows&#xff0c;Linux也可以用&#xff0c;都是命令行 下载路径&#xff08;https://github.com/BtbN/FFmpeg-Builds/releases&#xff09; 下载安装包&#xff1a;ffmpeg-n6.1-latest-win64-lgpl-6.1.zip&#xff0c;&#xff08;根据自己的平台选择下载&#xff09;并…

力扣-数组-414 第三大的数

解析 先利用set去重&#xff0c;然后用逆向遍历找到第三大的数 代码 class Solution { public:int thirdMax(vector<int>& nums) {set<int> numsToset;for(int i 0; i<nums.size(); i){numsToset.insert(nums[i]);}int index;if(numsToset.size() > …

没有公网IP实现seafile本地IP访问和虚拟局域网IP同时访问和上传文件

前言 Ubuntu 24.04 LTSDocker 安装 seafileOpenWrtTailscale Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘中&#xff0c;已经实现了本地局域网放问Ubuntu IP来访问Seafile&#xff0c;以及通过 Ubuntu 的 Tailscale IP 访问Seafile。但是&#xff0c;文…

私有IP、VLAN和VPC,分别适合哪些场景你知道吗?

当我们在云中构建应用程序&#xff0c;尤其是使用了第三方云服务商的服务并且我们无法完全掌控后端的每部分时&#xff0c;安全性可能是最需要关注的地方。但这是一项充满挑战的工作&#xff0c;因为保护应用程序的方法实在是太多了&#xff01;为了改善安全性&#xff0c;开发…