首页 > 其他分享 >Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!

Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!

时间:2023-12-06 19:03:51浏览次数:41  
标签:cache 实例 Spring Cache request 缓存 可用性 Boot TTL

你是否曾想过为什么在 Spring Boot 应用中缓存是如此重要?答案在于它通过减少数据检索时间来提高性能。在本文中,我们将深入探讨缓存对微服务模式的影响,并探讨根据操作易用性、速度、可用性和可观测性等因素选择正确缓存的重要性。我们还将探讨如何最大程度地提高缓存性能和可用性。

1 缓存实现

1.1 缓存对微服务模式的影响

考虑这样的情景,其中一个 Edge API 开放给互联网,触发对服务 A 和 B 的额外请求,这两个服务反过来调用服务 C 和 D。通过引入客户端缓存,可以显著提高应用程序性能并打破这种依赖链。

1.2 选择正确的缓存

在选择正确的缓存之前,我们必须了解我们应用的需求,并根据以下因素选择缓存:

  1. 操作易用性 — 是否需要向系统添加新组件?
  2. 速度 — 从缓存检索或设置值需要多长时间?
  3. 可用性 — 它如何提高系统的整体可用性?
  4. 可观测性 — 系统的状态推理有多容易?

2 缓存类型

有三种不同类型的缓存:

2.1. 本地缓存

  • 仅限于应用程序/节点运行的本地实例
  • 由于数据存储在本地,所以速度更快
  • 由于数据与其他缓存不共享,缺乏一致性
  • 在需要在多个节点之间共享大量数据的情况下效率低
  • 用例场景:当数据特定于单个实例且不需要在不同实例之间共享数据时

Local Cache

2.2. 分布式缓存

  • 由于缓存在多个实例之间共享,缓存的数据可由系统中的任何节点访问(用例:多个实例需要共享一个公共缓存)
  • 由于网络延迟,从远程节点访问数据可能需要一些时间,但并非总是如此
  • 由于每个实例将其更改传播到其他节点,因此一致性
  • 可高度扩展

Distributed Cache

2.3. 分层缓存

  • 每个客户端副本都保留本地缓存和远程缓存,作为回退
  • 这类似于 CPU 缓存
if local_cache_hit(request):
  return get_from_local_cache(request)
else:
  if remote_cache_hit(request):
    return get_from_remote_cache(request)
  else:
    response = call_a(request)
    set_local_cache_in_background(response)
    set_remote_cache_in_background(response)
    return response

每种缓存的目标都是最大程度地增加缓存命中,以提高系统的整体性能。那么在实际设置中,当我们有定期更新的动态数据并且还存储缓存内容以获得所需输出时,我们该如何做呢?

可为缓存设置生存时间(TTL)。如果我们为我们的缓存设置长时间的 TTL,比如近 24 小时,我们可能会读取陈旧的数据,另一方面,较短的 TTL 将增加新鲜度,但经常调用服务器可能会导致可用性和延迟问题。

我们将讨论一些策略,如面向事件驱动架构的主动失效和对于服务器不发出事件的情况下的后台刷新。

  1. 主动失效 → 用于事件驱动架构的最常见用法。每当服务器发出事件时,客户端都会监听它并更新缓存并清除不必要的缓存数据。我们可以设置较长的 TTL,知道过时的条目将被主动失效。
  2. 后台刷新 → 如果服务器不发出事件,我们可以在后台刷新条目,即使是缓存命中。我们的数据可能会变得不那么陈旧,而延迟将大大降低。

3 结论

实质上,在 Spring Boot 中进行缓存是提高性能的关键。从打破依赖关系到优化命中,它是微服务世界中高效和响应性系统的重要工具。

参考

  • [32. Caching - Spring Framework Documentation](

标签:cache,实例,Spring,Cache,request,缓存,可用性,Boot,TTL
From: https://blog.51cto.com/JavaEdge/8708364

相关文章

  • Spring MVC 源码 - HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod
    HandlerAdapter组件HandlerAdapter组件,处理器的适配器。因为处理器handler的类型是Object类型,需要有一个调用者来实现handler是怎么被执行。Spring中的处理器的实现多变,比如用户的处理器可以实现Controller接口或者HttpRequestHandler接口,也可以用@RequestMapping注......
  • Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!
    你是否曾想过为什么在SpringBoot应用中缓存是如此重要?答案在于它通过减少数据检索时间来提高性能。在本文中,我们将深入探讨缓存对微服务模式的影响,并探讨根据操作易用性、速度、可用性和可观测性等因素选择正确缓存的重要性。我们还将探讨如何最大程度地提高缓存性能和可用性。......
  • SpringBoot Seata 死锁问题排查
    现象描述:SpringBoot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出但是,奇怪的是,本地可以正常启动好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问题,这个不是重点,重点是怎么让它启动起来。(PS:我猜测可能是环境不同造成的,包括操作系统不同和JD......
  • 2023最新Spring Boot面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-SpringBoot面试题合集问:SpringBoot有哪些优点?SpringBoot具有一系列的优点,包括:简化配置:SpringBoot提供了许多自动配置,可以让你更方便地开发应用程序。快速开发:SpringBoot具有许多微服务构建工具,可以让你快速开发和部署应用程序......
  • springbootlearn01 ERROR汇总
    (1)关于IDEA未生成pom.xml文件通过springinitialize要确认[type]选项中为Mavenproject类型,不可选择其他(没有pom.xml)而POM(只会生成pom.xml)(2)关于spring-boot-starter-parent报红的解决方法关于mavenreload后仍无法加载包通过mvn-Uidea:idea命令重新加载maven包,具体操作是......
  • Java Spring Boot 基本使用123
    今天简单学习下SpringBoot的基本使用,在此基础上,我们就可以改造为更加庞大的项目,话不多说,看示例吧。1.IDEA设置首先通过ideafile->NewProject:注意SDK和java版本一致,我们的依赖管理用的是Maven。然后next选择SpringWeb:到此,一个SpringBootWeb项目就......
  • Java Spring Boot controller的使用之参数解析
    SpringBoot作为Java中广受欢迎的框架,其controller的使用必须掌握了解,本篇的学习将从以下几个方面展开:动态URL组路由参数解析Restfulcontroller本篇假设你已经了解SpringBoot开发的基本流程,以下示例主要从controller角度学习。1.动态URL说到此,做过web开发的......
  • Java Spring Boot logback 日志配置与使用总结
    在项目开发中,日志是必不可少的,没有日志,怎么排查bug,而且日志也有助于我们看到相关的输入输出,总的来说,日志是日常项目开发必须要有的。今天我们学习SpringBoot中集成logback日志,这里主要会涉及到日志的配置和简单实现,更多的细节请移步官方文档,自己品读,此文档有助于初涉Sprin......
  • Java Spring Boot 常用配置总结
    在涉及项目开发时,通常我们会灵活地把一些配置项集中在一起,如果你的项目不是很大的情况下,那么通过配置文件集中不失为一个很好的解决方案。在SpringBoot中,我们可以方便地通过读取appliction.properties/application.yaml格式的配置文件,进而注入我们的项目中。1.多环境配置......
  • 小白使用springboot项目进行开发系统前期工作
    首先进行项目的创建,springboot项目创建有两种方式。可以使用idea直接创建springboot项目,可以使用阿里云的源,创建会快一点这里可以选择各种的依赖第二种就是直接创建maven项目,直接导入pom坐标类似于这种,点击刷新即可点击查看代码<dependency>......