Spring Boot – 缓存
Spring Boot 是一个构建在 Spring Framework 之上的项目,它提供了一种更简单、更快捷的方式来设置、配置和运行简单的和基于 Web 的应用程序。它是当今开发人员中流行的框架之一,因为它具有快速的生产就绪环境,使开发人员能够直接专注于逻辑,而不是为配置和设置而苦恼。它是一个基于微服务的框架,用于创建一个独立的基于 Spring 的应用程序,我们可以使用最少的 Spring 配置运行该应用程序。
显着特点
- 不需要繁重的XML配置。
- 开发和测试 Spring Boot 应用程序很容易,因为它提供了基于CLI的工具,并且它还具有嵌入式 HTTP 服务器,例如 Tomcat、Jetty 等。
- 由于它使用约定优于配置,因此可以提高生产力并减少开发时间。
缓存是位于应用程序和持久性数据库或第三方应用程序之间的任何临时存储位置,用于存储最频繁或最近访问的数据,以便可以更快地处理未来对该数据的请求。它通过减少访问底层较慢存储层的需要来提高数据检索性能。与从数据库中获取数据相比,从内存中访问数据总是更快。缓存使经常访问的对象、图像和数据更靠近您需要它们的位置,通过不为相同的数据多次访问数据库或任何第三方应用程序来加快访问速度并节省金钱成本。可以缓存不经常更改的数据。
缓存类型
缓存主要有 4 种类型:
- CDN 缓存
- 数据库缓存
- 内存缓存
- Web 服务器缓存
1.CDN缓存
内容交付网络 (CDN)是一组分布式服务器,它们通过使 Web 内容更接近用户所在的位置来加速 Web 内容的交付。全球数据中心使用缓存,通过您附近的服务器更快地将互联网内容传送到支持 Web 的设备或浏览器,从而减少应用程序源的负载并改善用户体验。 CDN 在您的物理位置附近的代理服务器中缓存网页、图像和视频等内容。
2. 数据库缓存
数据库缓存通过将查询工作负载从后端分配到多个前端系统来提高可伸缩性。它允许灵活地处理数据。它可以通过避免过多地查询数据库来显着减少延迟并增加读取繁重的应用程序工作负载的吞吐量。
3. 内存缓存
内存缓存提高了应用程序的性能。内存缓存是一种常见的查询存储,因此可以减轻数据库的读取工作量。 Redis 缓存是内存缓存的示例之一。 Redis 是一种分布式的高级缓存工具,允许备份和恢复功能。内存缓存在缓存之上提供查询功能。
4. Web服务器缓存
Web 服务器缓存存储数据,例如由 Web 服务器提供的网页副本。它在用户第一次访问页面时被缓存或存储,当用户下次请求同一页面时,内容将从缓存中传递,这有助于防止源服务器过载。它显着提高了页面交付速度并减少了后端服务器需要完成的工作。
Spring Boot 的缓存注解
1.@Cacheable
为方法启用缓存行为的最简单方法是使用@Cacheable 对其进行标记,并使用将存储结果的缓存名称对其进行参数化。
@Cacheable(“name”)
public String getName(Customer customer) {…}
getName()调用将在实际调用方法之前首先检查缓存名称,然后缓存结果。我们还可以使用 condition 属性在注解中应用条件:
@Cacheable(value=”Customer”, condition=”#name.length<10″)
public Customer findCustomer(String name) {…}
2.@Cache 驱逐
因为缓存很小。我们不想用我们不经常需要的值填充缓存。缓存可以变得非常大,非常快。我们可以使用@CacheEvict注释来删除值,以便可以再次将新值加载到缓存中:
@CacheEvict(value=”name”, allEntries=true)
public String getName(Customer customer) {…}
它提供了一个名为allEntries的参数,该参数根据键逐出所有条目而不是一个条目。
3.@CachePut
@CachePut注解可以在不干扰方法执行的情况下更新缓存的内容。
@CachePut(value=”name”)
public String getName(Customer customer) {…}
每当我们更改条目时, @CachePut 都会选择性地更新条目,以避免从缓存中删除太多数据。 @Cacheable和@CachePut注释之间的主要区别之一是@Cacheable跳过方法执行,而@CachePut运行方法并将结果放入缓存中。
4.@缓存
@Caching 用于我们想在同一个方法上使用多个相同类型的注解的情况。
@CacheEvict(“name”)
@CacheEvict(value=”directory”, key=”#customer.id”)
public String getName(Customer customer) {…}
上面编写的代码将无法编译,因为Spring-Boot不允许为给定方法声明多个相同类型的注释。
@Caching(evict = {
@CacheEvict(“name”),
@CacheEvict(value=”directory”, key=”#customer.id”) })
public String getName(Customer customer) {…}
如上代码所示,我们可以通过@Caching使用多个缓存注解,避免编译错误。
5.@CacheConfig
使用@CacheConfig 注解,我们可以将一些缓存配置简化到类级别的一个地方,这样我们就不必多次声明东西了。
@CacheConfig(cacheNames={“name”})
public class CustomerData {
@Cacheable
public String getName(Customer customer) {…}
条件缓存
有时,一个方法可能并不总是适合缓存。缓存注释通过条件参数支持此类功能,该参数采用SpEL表达式,该表达式被评估为真或假。如果为 true,则缓存该方法,否则它的行为就像该方法未缓存一样,无论缓存中有什么值或使用什么参数,每次都会执行该方法。
@Cacheable(value=”name”, condition=”#customer.name == ‘Megan’ “)
public String getName(Customer customer) {…}
仅当参数名称等于 Megan 时,才会缓存上述方法。
除非参数
我们还可以根据方法的输出而不是通过unless参数的输入来控制缓存:
@Cacheable(value=”name”, unless=”#result.length() < 20″)
public String getName(Customer customer) {….}
上述注释将缓存地址,除非它们少于 20 个字符。了解条件很重要,除非参数可以与所有缓存注释一起使用。
缓存依赖
如果我们想在Spring Boot应用程序中启用缓存机制,我们需要在pom.xml文件中添加缓存依赖。它启用缓存并配置CacheManager 。