如何使用缓存提升SpringBoot性能(EhCache和Redis方式)

一、简介

缓存是通过将频繁访问的数据存储在内存中来提高Web应用程序性能的重要策略,从而减少对数据库等较慢的存储系统的重复进行数据检索操作的需求。在这里将介绍如何使用流行的缓存实现(如EhCache和Redis等),专门为Spring Boot应用程序制定有效的缓存策略。你将了解如何配置缓存、如何将其与Spring Boot集成,以及如何将这些技术应用到实际场景中,从而显著改善应用程序的响应时间和可扩展性。

二、什么是缓存?

缓存是指将文件或数据的副本存储在缓存或临时存储位置中,以便未来对该数据的请求可以更快地提供服务。当从存储中检索数据时,会在缓存中创建该数据的副本。如果再次需要该数据,可以从缓存中比从主存储器中更快地检索到该数据,主存储器可能涉及复杂的计算或较慢的访问速度。

2.1 缓存类型

  1. 内存缓存:数据直接存储在系统的主内存中,访问这些数据非常快速。Spring Boot可以使用其默认的缓存提供程序(如ConcurrentMapCache)来管理内存中的缓存,或者与EhCache或Hazelcast等更强大的解决方案集成。
  2. 分布式缓存:在微服务架构中非常有用,其中实例需要共享共同的缓存状态。在这些场景中通常使用Redis或Memcached等解决方案,允许实例在分布式系统中保持缓存一致性。
  3. 基于磁盘的缓存:这种缓存方式涉及将缓存数据存储在磁盘上。这虽然比内存缓存慢,但对于无法放入内存的大型数据集来说非常有用。

2.2 为什么要在Spring Boot中实施缓存

  1. 改进响应时间:缓存显著减少了获取数据所需的时间,从而加快了响应时间。这在接收高流量并执行复杂查询以检索数据的应用程序中尤为有益。
  2. 减少对数据库的工作负载:通过将经常访问的数据存储在缓存中,可以减少直接查询数据库的次数,从而防止数据库在高负载期间成为瓶颈。
  3. 成本效益:减少数据库查询次数可以降低数据库操作的成本,尤其是基于读/写次数计费的情况下。
  4. 可扩展性:缓存是应用程序扩展的关键组成部分,因为缓存可以减少重复数据处理的需求,从而使应用程序能够在使用相同资源量的情况下处理更多请求。

2.3 Spring Boot如何促进缓存

Spring Boot提供了一个无缝的缓存机制,只需使用几个注解就可以集成,使得它非常适合开发者使用。以下是关键组件:

  1. @EnableCaching:该注解用于在Spring Boot应用程序中启用缓存功能。
  2. @Cacheable:该注解用于方法,表示该方法的结果应存储在缓存中。下次使用相同参数调用该方法时,结果将从缓存中获取,而不是执行该方法。
  3. @CacheEvict:该注解用于从缓存中删除一个或多个条目。当缓存数据不再有效并且需要更新时,这非常有用。
  4. @CachePut:该注解使用方法执行的结果更新缓存,而不会干扰方法的执行本身。

通过了解这些基本原理并在适当的时候实施缓存,开发者可以显著提升其Spring Boot应用程序的性能和可扩展性。接下来的部分将介绍如何在Spring Boot中设置和使用EhCache和Redis,以便在不同场景中利用这些优势。

三、在Spring Boot中配置EhCache

EhCache是一个功能强大且广泛使用的缓存解决方案,提供了快速、可靠的进程内缓存,并具有配置和管理简单的特点。它特别适用于对延迟要求较高,且需要快速访问数据而又不涉及分布式缓存的网络调用开销的应用程序。接下来,我们将探讨如何在Spring Boot应用程序中配置和使用EhCache。

3.1 添加依赖项

首先,确保你的Spring Boot项目包含EhCache所需的必要依赖项。如果使用的是Maven,则需要在pom.xml文件中包含Spring Boot缓存启动器和EhCache依赖项:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId></dependency>
</dependencies>

这些依赖项会将所需的库添加到你的项目中,使Spring Boot能够自动配置缓存管理功能。

3.2 在Spring Boot中启用缓存

要在Spring Boot应用程序中启用缓存,请将@EnableCaching注解添加到其中一个配置类中。此注解可触发Spring Boot的缓存功能,并允许其识别应用程序中的其他与缓存相关的注解。

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableCaching
public class CacheConfig {
}

3.3 配置EhCache

EhCache可以通过编程方式或使用XML配置文件进行配置。对于许多应用程序来说,XML配置已经足够,并且更容易维护。

在项目的src/main/resources目录中创建一个ehcache.xml文件。该文件将定义应用程序使用的各种缓存以及它们的设置,如TTL(生存时间)、堆大小和其他参数:

<ehcache xmlns="http://www.ehcache.org/v3"><cache alias="userCache"><expiry><ttl unit="seconds">3600</ttl></expiry><heap>1000</heap><offheap unit="MB">100</offheap></cache><cache alias="productCache"><expiry><ttl unit="seconds">7200</ttl></expiry><heap>500</heap><offheap unit="MB">50</offheap></cache>
</ehcache>

在此配置中,我们定义了两个缓存:

  • userCache:存储用户数据,使用TTL(生存时间)为3600秒(1小时)。
  • productCache:存储产品详细信息,使用TTL(生存时间)为7200秒(2小时)。

3.4 在应用程序中使用EhCache

配置好EhCache后,就可以在服务类中使用@Cacheable、@CacheEvict和@CachePut注解了。下面举例说明如何在服务中缓存用户数据:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserService {@Cacheable(value = "userCache", key = "#userId")public User getUserById(String userId) {// Method to fetch user from the databasereturn userRepository.findById(userId).orElseThrow();}
}

在这个示例中,getUserById方法将首先检查给定userId的用户数据是否在userCache中。如果在缓存中,将返回缓存的数据,避免访问数据库。如果不在缓存中,该方法会正常执行,并将其结果存储在指定的键下的缓存中。

3.5 测试和监控

在实现缓存后,重要的是监控其对应用程序性能的影响。你应该查看缓存命中率、内存使用率和响应时间等指标,以了解缓存的有效性。Spring Boot Actuator提供了一些端点,可以帮助监控这些指标。

遵循以上步骤,就可以成功地将EhCache集成到Spring Boot应用程序中,通过减少数据检索时间和降低数据库负载来提高性能和可扩展性。这可以带来更好的用户体验和更低的基础设施成本。

四、在Spring Boot中利用Redis进行分布式缓存

Redis是一个内存数据结构存储,可用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希值、列表、集合、带有范围查询的有序集合、位图、HyperLogLog、带有半径查询的地理空间索引和流。Redis尤其流行的是其对分布式缓存的支持,对于需要在多个服务器或实例之间具有高可用性和可扩展性的应用程序来说,它是一个极佳的选择。

4.1 添加依赖项

要开始在Spring Boot应用程序中使用Redis进行缓存,首先需要添加必要的依赖项。如果使用的是Maven,请在pom.xml文件中包含Spring Boot Data Redis启动程序:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

这个依赖项包括Redis客户端库,允许Spring Boot自动配置连接到Redis服务器,并使用其进行缓存。

4.2 配置Redis连接

接下来,配置应用程序以连接到Redis服务器。通常在Spring Boot项目的application.properties或application.yml文件中完成此操作。在这里,可以指定Redis服务器的主机、端口和其他参数,如连接超时:

# Redis服务器配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.timeout=5000

这些设置告诉Spring Boot在哪里找到Redis服务器以及如何连接到它。请根据你的环境和Redis设置调整这些设置。

4.3 在Spring Boot中启用缓存

类似于其他缓存设置,需要使用@EnableCaching注解在Spring Boot应用程序中启用缓存:

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableCaching
public class CacheConfiguration {
}

这个配置类激活了Spring Boot的缓存机制,由于你已经配置了Redis的依赖项和属性,它现在将识别并使用Redis作为缓存提供程序。

4.4 使用Redis进行缓存

要将Redis作为缓存存储使用,可以使用@Cacheable对服务方法进行注解,并指定缓存名称。当调用带有@Cacheable注解的方法时,Spring Boot会首先检查缓存中是否已经存在结果,如果存在则立即返回结果,如果不存在则将结果存储在缓存中:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class ProductService {@Cacheable(value = "productCache", key = "#productId")public Product getProductById(String productId) {// Simulate fetching product from a databasereturn productRepository.findById(productId).orElseThrow();}
}

在这个示例中,getProductById方法将在名为productCache的Redis缓存中查找具有给定productId的产品。如果产品没有被缓存,该方法将正常执行,从数据库中检索产品,然后将结果存储在缓存中,以供将来的请求使用。

4.5 高级配置

如果需要更高级的配置,例如设置缓存过期时间或自定义序列化机制,你可以在配置类中定义一个RedisCacheManager Bean。这样就可以更精细地控制从Redis缓存和检索对象的方式:

import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;import java.time.Duration;@Configuration
public class RedisConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))  // Set default cache expiration time.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();}
}

这个设置不仅可以配置缓存条目的过期时间,还可以自定义序列化方法,在本示例中使用的是JSON,它通常比Java序列化更灵活、更通用。

将Redis集成到你的Spring Boot应用程序中进行分布式缓存,可以显著提高应用程序的性能和可扩展性。使用Redis,可以获得一个高效、强大的缓存解决方案,能够在多个实例之间处理大量请求并保持一致的性能。这使得Redis成为企业级应用程序和微服务架构的理想选择,其中高可用性和水平扩展性是首要考虑的因素。

五、结论

在你的Spring Boot应用程序中实施缓存可以显著提升其性能、可扩展性和用户体验。在本文中,我们探讨了如何集成和配置两种强大的缓存解决方案:EhCache用于满足简单的进程内缓存需求,Redis用于满足更复杂的分布式缓存场景。通过选择合适的缓存策略和技术,可以确保你的应用程序在不同的负载下都能保持响应和高效。

无论你选择简单、快捷的EhCache还是可扩展且功能强大的Redis,每种缓存方法都能提供独特的优势,可以根据应用程序的具体需求进行定制。通过有效利用这些技术,你可以减少加载时间,最大限度地减轻数据库压力,并为用户提供更流畅的体验。通过缓存,你的Spring Boot应用程序不仅速度更快,而且更具成本效益,能够轻松处理增加的流量。

随着技术和需求的不断发展,你的缓存策略也应相应调整。定期检查和调整缓存策略将有助于保持最佳性能,并适应应用程序增长中的新挑战。

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

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

相关文章

使用 Smart-doc 记录 Spring REST API

如果您正在使用 Spring Boot 开发 RESTful API&#xff0c;您希望让其他开发人员尽可能容易地理解和使用您的 API。文档是必不可少的&#xff0c;因为它为将来的更新提供了参考&#xff0c;并帮助其他开发人员与您的 API 集成。很长一段时间以来&#xff0c;记录 REST API 的方…

java设计模式(十二)享元模式(Flyweight Pattern)

1、模式介绍&#xff1a; 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态&#xff08;可共享&#xff09;和外部状态&#xff08;不可共享&#xff09;来减少内存消耗和提高性能。内部状态存储在享元对…

苏东坡传-读书笔记九

我们论到苏东坡&#xff0c;我们就不能避免“气”这个字。因为每个文学批评家综括苏东坡的个性&#xff0c;必用孟子所说的这个“气”字。 在《孟子》里&#xff0c;“气”是哲学的概念&#xff0c;类似柏格森所说的“生气勃勃”&#xff0c;是人格上的“元气”。使伟人和匹夫显…

419. 甲板上的战舰

419. 甲板上的战舰 题目链接&#xff1a;419. 甲板上的战舰 代码如下&#xff1a; class Solution { public:int countBattleships(vector<vector<char>>& board) {int res0;int rowboard.size(),colboard[0].size();for(int i0;i<row;i){for(int j0;j&l…

深度学习中的Logits处理:InvalidScoreLogitsProcessor详解

深度学习中的Logits处理&#xff1a;InvalidScoreLogitsProcessor详解 基础概念InvalidScoreLogitsProcessor为什么需要这个处理器&#xff1f;使用示例进阶&#xff1a;自定义LogitsProcessor结论 在自然语言处理(NLP)任务中,特别是在使用大型语言模型(LLM)进行文本生成时,我们…

【 2024!深入了解 大语言模型(LLM)微调方法(总结)】

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

《C++20设计模式》桥接模式经验分享

文章目录 一、前言二、探讨一个类有多个抽象父类的情况&#xff08;为什么会有桥接&#xff09;三、桥接模式3.1 UML类图3.2 实现 四、最后 一、前言 怎么判断你是否理解桥接模式了呢&#xff1f;&#x1f9d0; 试着回答下面这个问题吧&#xff01;&#x1f60b; 桥接模式到底…

Current request is not a multipart request

看了许多博客的解决方法&#xff0c;感觉还是不太懂&#xff0c;看了这个解决了问题。 从源码角度详细解析

【数据库】范式

文章目录 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. 巴斯-科德范式&#xff08;BCNF&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&#xff0c;又称完美范式&…

heic格式转化jpg有没有免费软件?2024年顶尖的7款heic转jpg工具请收好!

heic格式转化jpg有没有免费软件&#xff1f;heic格式虽然在分辨率上优于jpg&#xff0c;但由于并非所有设备的默认图片格式&#xff0c;许多用户并不太喜欢它。这并不奇怪&#xff0c;因为在非苹果设备上打开HEIC文件可能会遇到困难。因此&#xff0c;人们更倾向于寻找能够免费…

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…

监控与安全服务

kali 系统 nmap扫描 网段的扫描 使用脚本扫描 使用john破解密码 哈希算法是一种单向加密的算法&#xff0c;也就是将原始数据生成一串“乱码”只能通过原始数据&#xff0c;生成这串“乱码”&#xff0c;但是不能通过“乱码”回推出原始数据相同的原始数据&#xff0c;生成的乱…

sql优化-单表优化

文章目录 0、索引优化原则1、在docker内部连接mysql2、数据准备3、创建表 dept 和 emp4、插入50万数据到 emp 表中4.1、创建函数4.2、存储过程4.3、调用存储过程 5、查找姓名以"abc"开头的员工信息5.1、执行计划 select * from emp where name like abc%;5.2、sql优化…

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…

无线领夹麦克风哪个品牌好,推荐口碑最好的麦克风品牌

在5G网络普及的浪潮下&#xff0c;短视频平台的兴起带动了一股全民创作的热潮。无论是城市街头还是乡间小径&#xff0c;人们纷纷拿起手机&#xff0c;记录生活中的点点滴滴。领夹式麦克风凭借其精准的拾音特性和稳定的信号传输&#xff0c;无论是在静止状态还是在移动过程中&a…

Android什么是OSD层图形?

在Android开发中&#xff0c;OSD&#xff08;On-Screen Display&#xff09;层图形指的是在屏幕上直接显示特定信息的技术&#xff0c;这些信息可以是文字、图标、进度条等&#xff0c;主要用于展示应用程序状态、提示信息、操作指引等。从技术难点、面试官关注点以及回答吸引力…

制作一个静态库

1. 准备工作 # 目录结构 add.c div.c mult.c sub.c -> 算法的源文件, 函数声明在头文件 head.h # main.c中是对接口的测试程序, 制作库的时候不需要将 main.c 算进去 . ├── add.c ├── div.c ├── include │ └── head.h ├── main.c ├── mult.c └── s…

Node.js适合什么场景下使用

Node.js是一个基于Chrome V8 JavaScript引擎构建的开源运行时环境&#xff0c;它允许开发者使用JavaScript在服务器端运行代码。Node.js具有高性能、轻量级、事件驱动和非阻塞I/O等特性&#xff0c;这些特性使得它在多种场景下具有广泛的应用。以下是Node.js适合使用的几个主要…

Protocol Buffers 协议 .proto 文件的编写指南及注意事项

Protocol Buffers&#xff08;简称protobuf&#xff09;是Google提供的一种数据序列化协议(轻便高效) 编写 .proto 文件是定义 gRPC 服务和消息结构等的关键步骤。以下是详细指南&#xff0c;包括编写 .proto 文件的基本语法和注意事项。 1. 基本语法 一个 .proto 文件通常包…