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

你是否曾想过为什么在 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](

    本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[RISCV] 发现一个可以看RISC-V CPU行为的开源项目

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下: A small program that handles mie, msi, mti and trap interrupts and updates some global variables on interrupts. 重点是他下面还放了一张图: 能看到RISCV CSR的行为太酷啦!!! 下面一起setup一…

Sourcepawn脚本入门(二)命令与事件监听

🍎Sourcepawn脚本入门(二)命令与事件监听 (控制台)命令是常用的插件形式,eg. noclip …等都是常用的命令,在游戏中使用也很容易,souremod可以注册自己的命令。 事件的监听则需要考虑到不同的起源游戏支持的事件不同&am…

中文BERT模型预训练参数总结以及转化为pytorch的方法

1.目前针对中文的bert预训练模型有三家: 谷歌发布的chinese_L-12_H-768_A-12 还有哈工大的chinese-bert-wwm / chinese-bert-wwm-ext 以及HuggingFace上的bert-base-chinese(由清华大学基于谷歌的BERT在中文数据集上训练开发的模型,上传在HuggingFace) …

彻底删除VsCode配置和安装过的插件与缓存

前言 当你准备对 Visual Studio Code(VSCode)进行重新安装时,可能遇到一个常见问题:重新安装后,新的安装似乎仍然保留了旧的配置信息,这可能会导致一些麻烦。这种情况通常是由于卸载不彻底所致&#xff0c…

【LVS实战】04 LVS+Keepalived实现负载均衡高可用

一、介绍 Keepalived 是一个用于 Linux 平台的高可用性软件。它实现了虚拟路由器冗余协议 (VRRP) 和健康检查功能,可以用于确保在多台服务器之间提供服务的高可用性。Keepalived 可以检测服务器的故障,并在主服务器宕机时,自动将备份服务器提…

外卖系统源码开发:打造高效智能化餐饮解决方案

在当今数字化时代,外卖系统成为了餐饮业中不可或缺的一部分。为了满足日益增长的外卖需求,我们将深入探讨外卖系统源码开发的关键技术和创新应用。 1. 技术栈选择 在开始外卖系统源码的开发之前,我们首先需要选择适用的技术栈。一个典型的…

【langchain实战】开源项目-RasaGPT

1、概述 RasaGpt是一个建立在 Rasa 和 Langchain 之上的没有显示界面的LMM聊天机器人平台。它是一个Rasa和Telegram这种利用像Langchain这样的LMM库进行索引、检索和上下文注入的样板及参考实现。 开源地址: GitHub - paulpierre/RasaGPT: 💬 RasaGPT is…

揭秘:软件测试中Web请求的完整流程!

在软件开发的过程中,测试是一个至关重要的环节。而在现代互联网应用中,Web请求是很常见的一个测试需求。本文将介绍Web请求的完整测试流程,帮助读者更好地理解软件测试的关键步骤。 一、测试准备阶段 在进行Web请求测试之前,测试团…

【CMake入门】第二节——CMake常用指令介绍

系列文章: 【CMake入门】第一节——CMake的安装与简单样例 CMake常用指令介绍 cmake_minimum_required 指定要求最小的cmake版本,如果版本小于该要求,程序终止 project(test) 设置当前项目名称为test CMAKE_BUILD_TYPE 用于设置CMake构…

招商银行薪福:一站式API连接电商平台,实现CRM与客服系统集成

招商银行薪福通的API集成优势 招商银行的SaaS产品薪福通在电商行业迅速崭露头角,它通过一站式API连接,极大地简化了电商平台与CRM及客服系统的集成过程。企业无需深入研究API开发细节,也不必担心代码复杂性,就能实现系统间的高效…

LeetCode力扣每日一题(Java):14、最长公共前缀

一、题目 二、解题思路 1、我的思路 乍一看我的代码量还是比较少,但是提交上去发现时间效率和空间效率都不占优势 讲讲我的思路:首先通过for循环找出数组中长度最短的字符串,并用min储存最短字符串的长度,最长公共前缀不可能比…

SAP MM 中的业务伙伴确定配置

这篇博客文章将概述 SAP MM 供应商帐户组中的合作伙伴确定是什么以及如何在 S/4 系统中配置它。 本文将指导您完成分步过程,并为您提供有关在供应商主数据中使用合作伙伴确定的完整想法。 合作伙伴角色 供应商在 SAP 中扮演着不同类型的角色,让我们通…

基于JavaSwing实现的学生管理系统(课程设计必备)

基于JavaSwing实现的学生管理系统,最全的Java基础学生管理系统,Java课程设计必备 系统一共包括学生信息管理,考勤签到管理,学生成绩管理,学生选课管理系统。不仅有基础功能,还有图表统计等功能。功能是非常…

记录 | chrome下载提速

chrome浏览器下载提速的方法: 谷歌浏览器一直都带有多线程下载模式,只不过默认关闭了,打开后下载速度会提升很多,只要在新标签页输入 chrome://flags/#enable-parallel-downloading ,点enter,出现下图点击…

逆向修改Unity的安卓包资源并重新打包

在上一篇文章中,我已经讲过如何逆向获取unity打包出来的源代码和资源了,那么这一节我将介绍如何将解密出来的源代码进行修改并重新压缩到apk中。 其实在很多时候,我们不仅仅想要看Unity的源码,我们还要对他们的客户端源码进行修改和调整,比如替换资源,替换服务器连接地址…

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Beam Search学习

BackGround 在生成的时候,模型的输出是一个时间步一个时间步依次获得的,而且前面时间步的结果还会影响后面时间步的结果。也就是说,每一个时间步,模型给出的都是基于历史生成结果的条件概率。 为了生成完整的句子,需…

Codeforces Round 913 (Div. 3) A~E

目录 A. Rook 问题分析: B. YetnotherrokenKeoard 问题分析: C. Removal of Unattractive Pairs 问题分析: D. Jumping Through Segments 问题分析: E. Good Triples 问题分析: A. Rook 问题分析: 给一个棋子将其同行同列的位置输出 #include<bits/s…

ABAP 字符串空白值保留长度或者用其他字符替代

保留空白值在字符串的长度。 DATA lv_char1 TYPE string VALUE Hello. DATA lv_char2 TYPE string VALUE World. DATA LV_CHAR3 TYPE C LENGTH 50.DATA(lv_string3) |{ lv_char1 } { lv_char2 }!|.WRITE: / lv_string3.DATA(lv_string2) lv_char1 && | { lv_char3 } …

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…