Java Web开发实战与项目——Spring Boot与Redis实现缓存管理

缓存技术在现代Web开发中至关重要,尤其是在高并发的环境中,缓存能够有效减少数据库访问压力、提高系统性能。Redis作为最流行的内存数据存储系统之一,常用于缓存管理。本节将讲解如何在Spring Boot项目中集成Redis,实现缓存管理,并深入探讨Redis的基础、缓存失效策略以及如何使用Redis构建分布式缓存。


1. Redis基础与Spring Data Redis
1.1 Redis简介

Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存以及消息队列系统。Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。Redis的特点是高效、持久化支持、发布订阅机制和简单的API。

1.2 Spring Data Redis

Spring Data Redis是Spring Data项目的一部分,旨在简化Redis的使用,它封装了Jedis和Lettuce等Redis客户端,并提供了与Spring的其他部分(如Spring Boot、Spring Cache等)无缝集成的功能。通过Spring Data Redis,可以轻松实现Redis的存取操作,支持常见的数据结构操作。

1.3 配置Redis连接

首先,我们需要在Spring Boot项目中配置Redis连接。在application.propertiesapplication.yml文件中进行以下配置:

spring:redis:host: localhostport: 6379password: # 如果有密码的话可以配置timeout: 3000jedis:pool:max-active: 10max-idle: 5min-idle: 1max-wait: 2000

这里的配置包括Redis的主机地址、端口、连接池配置等。Spring Boot通过spring-boot-starter-data-redis自动装配了Redis的相关组件。

1.4 RedisTemplate与StringRedisTemplate

Spring Data Redis提供了两个常用的类:RedisTemplateStringRedisTemplate

  • RedisTemplate: 用于支持所有类型的Redis数据结构。
  • StringRedisTemplate: 继承自RedisTemplate,专门用于操作字符串类型的数据。

通常情况下,推荐使用StringRedisTemplate处理简单的字符串缓存,RedisTemplate适合处理复杂的数据类型。

2. 在项目中集成Redis缓存

在Spring Boot中集成Redis缓存十分简单,Spring Cache提供了对Redis的支持。接下来,我们将实现一个简单的缓存管理系统,使用Redis作为缓存存储。

2.1 添加依赖

pom.xml中添加Spring Data Redis和缓存相关的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.2 开启缓存支持

在主启动类中(例如Application.java)开启Spring缓存支持:

@SpringBootApplication
@EnableCaching  // 开启缓存支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2.3 使用缓存注解

使用@Cacheable注解实现缓存。当某个方法被调用时,Spring首先会检查缓存中是否已有数据。如果有,直接返回缓存数据;如果没有,执行方法并将结果存入缓存。

@Service
public class ProductService {@Cacheable(value = "products", key = "#productId")public Product getProductById(Long productId) {// 模拟数据库查询return productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));}
}

在此示例中,@Cacheable会根据productId作为缓存的键,将返回的Product对象存储在products缓存中。如果同样的productId再次被请求,Spring会直接从Redis中读取数据。

2.4 缓存管理与清除

除了缓存数据,我们还可以使用@CachePut来更新缓存,使用@CacheEvict来清除缓存。

@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {return productRepository.save(product);
}@CacheEvict(value = "products", key = "#productId")
public void deleteProduct(Long productId) {productRepository.deleteById(productId);
}
  • @CachePut: 在每次方法执行后都更新缓存。
  • @CacheEvict: 清除缓存,当缓存失效时会重新加载数据。

3. 缓存失效策略与分布式缓存

缓存管理不仅仅是将数据存入缓存,还需要考虑缓存的失效策略、过期时间设置,以及如何实现分布式缓存。

3.1 缓存失效策略

Redis支持多种缓存失效策略,常见的有以下几种:

  • 设置过期时间:使用expire命令设置缓存过期时间。当缓存超过指定时间后,Redis会自动删除该缓存项。
  • LRU(Least Recently Used)淘汰策略:Redis支持设置最大内存限制,当缓存占用内存达到上限时,Redis会根据LRU算法淘汰最久未使用的数据。
  • 定期删除:Redis会定期扫描缓存,删除已经过期的键。

在Spring中,可以通过@Cacheablettl(过期时间)来配置缓存失效时间。例如,缓存15分钟:

@Cacheable(value = "products", key = "#productId", ttl = 900)
public Product getProductById(Long productId) {return productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));
}
3.2 分布式缓存设计

在分布式系统中,缓存通常不仅仅部署在单个Redis实例上,而是需要支持多个Redis节点。Spring Boot通过Redis集群、Redis哨兵等方案支持分布式缓存。

  • Redis集群:通过Redis Cluster可以实现数据的水平分片,确保缓存可以跨多个Redis节点分布。
  • Redis哨兵:Redis Sentinel可以实现高可用性和自动故障切换。

为了支持分布式缓存,我们可以使用Redis Cluster或哨兵的配置来确保高可用性。在application.yml中配置Redis集群:

spring:redis:cluster:nodes:- 127.0.0.1:7000- 127.0.0.1:7001- 127.0.0.1:7002password: yourpassword

Spring Boot会自动识别Redis集群配置,连接多个Redis节点,并进行缓存数据的分布式存储和管理。

3.3 缓存穿透与击穿解决方案

在实际应用中,缓存穿透和缓存击穿是两个常见问题:

  • 缓存穿透:指查询不存在的数据,直接访问数据库而绕过缓存。解决方法是使用布隆过滤器(Bloom Filter)来判断数据是否存在。
  • 缓存击穿:指缓存中的数据过期后,多个请求同时访问该数据,导致大量并发请求直接访问数据库。解决方法是使用互斥锁或@Cacheablesync参数,确保只有一个请求去加载数据。

总结

本文详细介绍了如何在Spring Boot中集成Redis缓存管理。通过Spring Data Redis,能够快速地将Redis引入到Spring Boot应用中,实现缓存功能。通过使用@Cacheable@CachePut@CacheEvict等注解,我们能够方便地管理缓存的增删改查。

此外,我们还讨论了Redis的缓存失效策略以及如何设计分布式缓存系统。对于高并发、大规模数据的应用,Redis提供的各种缓存策略和高可用性解决方案能够显著提高系统的性能和稳定性。通过合理设计缓存失效策略和处理缓存穿透、缓存击穿等问题,我们能够构建一个高效的缓存管理系统。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

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

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

相关文章

C语言学习【1】C语言关于寄存器的封装

目录 1.封装寄存的C语言的语法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中&#xff0c;底层一定是操作寄存器&#xff0c;我有一个理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知识点融入自己的理解之中&…

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…

ollama 学习笔记

1. 参考博客&#xff1a;1. Ollama完整教程&#xff1a;本地LLM管理、WebUI对话、Python/Java客户端API应用&#xff1a;https://blog.csdn.net/python122_/article/details/1409457202. https://gitee.com/ai-big-model/ollama/tree/main --》REST APIollama 离线安装包 ollam…

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 万像素&#xff08;1600x1200&#xff09;。 输出格式&#xff1a;JPEG、YUV、RGB。 内置图像处理功能&#xff1a;自动曝…

vue2.x中父组件通过props向子组件传递数据详细解读

1. 父组件向子组件传递数据的步骤 在子组件中定义 props&#xff1a; 子组件通过 props 选项声明它期望接收的数据。props 可以是数组形式&#xff08;简单声明&#xff09;或对象形式&#xff08;支持类型检查和默认值&#xff09;。 在父组件中使用子组件时绑定 props&#x…

【Gin】2:快速上手Gin框架(模版、cookie、session)

本文目录 一、模版渲染二、自定义模版函数三、cookie四、Session五、cookie、session区别六、会话攻击 一、模版渲染 在 Gin 框架中&#xff0c;模板主要用于动态生成 HTML 页面&#xff0c;结合 Go 语言的模板引擎功能&#xff0c;实现数据与视图的分离。 模板渲染是一种动态…

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。专栏强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传

* BootStrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签&#xff0c;确认结构 3、通过自定义属性&#xff0c;控制弹框的显示和隐藏 其中的bootstrap.css…

数据结构:双链表list

list 是 C 标准库中的双向链表容器。 list初始化示例&#xff1a; #include <list>int n 7;std::list<int> lst; // 初始化一个空的双向链表 lststd::list<int> lst(n); // 初始化一个大小为 n 的链表 lst&#xff0c;链表中的值默认都为 0std::list<i…

AI Agent Service Toolkit:一站式大模型智能体开发套件

项目简介 该工具包基于LangGraph、FastAPI和Streamlit构建,提供了构建和运行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服务、用于与服务交互的客户端以及一个使用客户端提供聊天界面的Streamlit应用。用户可以利用该工具包提供的模板快速搭建基于LangGraph框架…

论文概览 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年10月第50卷第8期的论文的题目和摘要&#xff0c;一共包括21篇SCI论文&#xff01; 论文1 Advances in geospatial approaches to transport networks and sustainable mobility …

大语言模型推理能力从何而来?

前言 DeepSeek R1采用强化学习进行后训练&#xff0c;通过奖励机制和规则引导模型生成结构化思维链&#xff08;CoT&#xff09;&#xff0c;从而显著提升了推理能力。这一创新方法使得DeepSeek R1能够在无需大量监督数据的情况下&#xff0c;通过自我进化发展出强大的推理能力…

用 WOW.js 和 animate.css 实现动画效果

用 wow.js 就可以实现动画效果&#xff0c;但由于里面的动画样式太少&#xff0c;一般还会引入 animated.css 第一步&#xff1a;下载 选择合适的包管理器下载对应的内容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …

设计模式教程:解释器模式(Interpreter Pattern)

1. 什么是解释器模式&#xff1f; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;通常用于处理语言&#xff08;例如数学表达式、SQL查询等&#xff09;中的语法和解释。该模式定义了一个文法&#xff0c;并通过解释器类来解释文法中…

STM32MP157A单片机移植Linux驱动深入版

需求整理 在Linux设备树中新增leds节点&#xff0c;其有3个gpio属性&#xff0c;分别表示PE10对应led1&#xff0c;PF10对应led2&#xff0c;PE8对应led3&#xff0c;设备树键值对如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…

本地DeepSeek模型GGUF文件转换为PyTorch格式

接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…

http代理IP怎么实现?如何解决代理IP访问不了问题?

HTTP代理是一种网络服务&#xff0c;它充当客户端和目标服务器之间的中介。当客户端发送请求时&#xff0c;请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器。同样&#xff0c;目标服务器的响应也会先发送到代理服务器&#xff0c;再由代理服务器返回给…

人工智能之数学基础:施密特正交化

本文重点 在前面的课程中,我们学习了线性空间的基,其中有一个标准正交基的概念,假设现在有一个线性向量空间,然后已经确定了该线性空间的一组基,那么如何将其转变为标准正交基。本文将学习如何通过施密特正交化完成这个任务。 施密特正交化 施密特正交化(Schmidt Orth…