架构设计 - 本地热点缓存

摘要:

缓存体系架构:

一级缓存:JVM本地缓存

二级缓存:Redis集中缓存

三级缓存:Nginx缓存(Proxy Cache缓存;Lua缓存)

Java(或任何编程语言)中的本地热点缓存(通常指的是本地缓存,如使用Guava Cache、EhCache、Caffeine等库实现的缓存,或者简单的HashMap/ConcurrentHashMap作为缓存)在性能优化中起着至关重要的作用。以下是为什么Java(以及许多其他系统和应用)需要本地热点缓存的几个主要原因:

减少数据库或远程服务调用

  • 当应用需要频繁访问数据库或远程服务来获取数据时,这些调用可能会成为性能瓶颈。本地缓存允许应用存储常用数据,并在需要时直接从缓存中获取,而不是每次都进行远程调用。

降低网络延迟

  • 对于分布式系统,远程服务调用通常涉及网络延迟。本地缓存可以显著减少这些延迟,因为数据直接从本地内存中获取。

提高响应速度

  • 由于数据是从本地内存中检索的(比从磁盘或网络获取要快得多),因此应用可以更快地响应请求。

减轻数据库压力

  • 通过减少数据库查询,本地缓存可以帮助减轻数据库服务器的负载,使其能够更有效地处理其他请求。

实现一致性策略

  • 本地缓存允许应用实现更复杂的一致性策略,如最终一致性,同时保持高性能。

缓存热点数据

  • 在许多应用中,存在所谓的“热点数据”,即被频繁访问的数据。本地缓存可以确保这些热点数据始终在内存中,从而加速访问。

支持事务和并发

  • 一些缓存库(如Guava Cache和Caffeine)提供了对事务和并发的支持,确保在多线程环境中缓存的正确性和性能。

缓存失效和更新

  • 本地缓存通常具有失效策略(如基于时间或基于访问的失效)和更新策略(如写穿、写回或刷新),以确保缓存中的数据与数据源保持一致。

减少资源消耗

  • 虽然缓存本身会消耗一些内存,但它通常可以显著减少CPU和网络资源的消耗,因为应用不需要频繁地进行远程调用或执行复杂的计算。

易于实现和集成

  • Java提供了许多易于使用和集成的缓存库和框架,使得在应用中实现本地缓存变得相对简单。

总之,本地热点缓存是优化Java应用性能的重要工具之一,它可以帮助应用更快地响应请求、减轻数据库压力、降低网络延迟,并提高整体系统的可扩展性和可靠性。

基于 google guava 实现的本地热点缓存示例

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;import java.time.Duration;
import java.util.concurrent.Executors;/*** @desc 本地热点缓存 Cache 工具类**/
public class CacheUtils {/*** 构建异步刷新的 LoadingCache 对象** @param duration 过期时间* @param loader  CacheLoader 对象* @return LoadingCache 对象*/public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {return CacheBuilder.newBuilder()// 设置缓存窗口初始容量为10.initialCapacity(10)// 设置缓存中存储的KEY超过100个后按照LRU策略移除.maximumSize(100)// 只阻塞当前数据加载线程,其他线程返回旧值.refreshAfterWrite(duration)// 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程.build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool()));}/*** 构建同步刷新的 LoadingCache 对象** @param duration 过期时间* @param loader  CacheLoader 对象* @return LoadingCache 对象*/public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);}}

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

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

相关文章

游戏测试工程师面试,常问的问题有哪些?

一般会在面试中了解以下方面&#xff1a; 1.游戏热情&#xff0c;理解程度 玩过哪些游戏&#xff0c;这些游戏玩过多长时间&#xff0c;玩到什么样的水平&#xff0c;在游戏里花过多少钱 你觉得游戏里&#xff0c;xxx的设计如何&#xff0c;评价一下 2.编程、测试相关 学过哪…

使用注解配置定义和管理 Spring Bean

Spring 框架提供了多种方式来定义和管理 Bean&#xff0c;其中使用注解配置是现代 Spring 应用程序中最常用和推荐的方式。注解配置简化了 Bean 的定义和依赖注入过程&#xff0c;使代码更简洁、更易读。本文将详细介绍如何使用注解配置来定义和管理 Spring Bean。 一、Spring…

任务3.8.3 利用RDD统计每日新增用户

任务目标 统计给定用户访问历史数据中&#xff0c;每日的新增用户数量。 数据准备 原始数据格式&#xff1a;每行包含两个字段&#xff0c;日期和用户名&#xff0c;以逗号分隔。示例数据&#xff1a;2024-05-01,mike 2024-05-01,alice 2024-05-01,brown ...解决方案 使用倒…

【2024.6.21】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Notepad++插件 Hex-Edit

Nptepad有个Hex文件查看器&#xff0c;苦于每次打开文件需要手动开插件显示Hex&#xff0c;配置一下插件便可实现打开即调用 关联多个二进制文件&#xff0c;一打开就使用插件的方法&#xff0c;原来是使用空格分割&#xff01;&#xff01;&#xff01;

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Thread

目录 Thread API 主要接口说明 测试代码编写 代码分析 hi3861使用的实时系统主要是基于Huawei LiteOS-M&#xff0c;这是华为针对物联网领域推出的轻量级物联网操作系统内核。LiteOS-M是Huawei LiteOS的一个分支&#xff0c;专为IoT领域构建&#xff0c;主要面向没有MMU&am…

sqlmap使用以及GUI安装

下载 GUI版地址: GitHub - honmashironeko/sqlmap-gui: 基于官版本 SQLMAP 进行人工汉化&#xff0c;并提供GUI界面及多个自动化脚本 GUI使用 可以点击.bat启动 如果点击.bat启动不了就在这里打开cmd,输入对应的.bat来启动 linux安装 地址:sqlmap: automatic SQL injection…

c++中串口的安全封装使用

固定缓冲区大小&#xff1a;在这种情况下&#xff0c;你将缓冲区大小固定为4096字节。如果你的数据量可能超过这个限制&#xff0c;可能需要反复调用读取操作以确保读取完整的数据。 局部变量初始化&#xff1a;在C中&#xff0c;局部变量如果不是内置类型&#xff08;如int、…

Java基础——String类详解,实用解释

String类(不是基本数据类型) - String的不可变性 在 Java 8 中&#xff0c; String 内部使用 char 数组存储数据。并且被声明为 final &#xff0c;因此它不可被继承。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…

python从入门到精通3:变量

在Python编程中&#xff0c;变量是一个非常重要的概念。它们用于存储数据&#xff0c;并在程序执行过程中进行数据的读取、修改和传递。理解变量的概念、命名规则、数据类型以及作用域&#xff0c;对于编写高效、健壮的Python代码至关重要。下面&#xff0c;我们将对Python变量…

收藏||电商数据采集流程||电商数据采集API接口

商务数据分析的流程 第一步&#xff1a;明确分析目的。首先要明确分析目的&#xff0c;并把分析目的分解成若干个不同的分析要点&#xff0c;然后梳理分析思路&#xff0c;最后搭建分析框架。 第二步&#xff1a;数据采集。主流电商API接口数据采集&#xff0c;一般可以通过数…

集装箱超重问题怎么解决一文读懂‼️

超重处理与限重政策详解 在国际海运过程中&#xff0c;集装箱超重会面临不同的处理方式和限制政策。以下是详细解析&#xff1a; 一、超重处理 船公司超重处理&#xff1a; 补交超重费&#xff1a;与船公司协商&#xff0c;补交超重费即可正常运输。 港区超重处理&#xff1a;…

顶顶通呼叫中心中间件-私有化asrproxy安装指南

一、安装asrproxy 上传asrproxy安装包到服务器目录&#xff1a;/root 上传完成之后依次执行下面的命令即可依次执行以下命令 cd ~mkdir -p /ddt/asrproxyunzip asrproxy_*.zip -d /ddt/asrproxycd /ddt/asrproxychmod x installlib.sh./installlib.shchmod x asrproxychmod x…

浪潮(Inspur)服务器硬件监控指标解读

随着企业业务的快速发展&#xff0c;服务器的稳定运行成为保障业务连续性的关键。浪潮&#xff08;Inspur&#xff09;服务器以其卓越的性能和稳定性&#xff0c;在数据中心中扮演着重要角色。 为了确保服务器的稳定运行&#xff0c;监控易作为一款专业的IT基础设施监控软件&am…

工控巨头去年业绩飙升10%,今年250亿出售子业务给美国黑石集团,意欲何为?...

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 在工业自动化领域&#xff0c;艾默生一直以其卓越的技术和强…

互联网摸鱼日报(2024-06-21)

互联网摸鱼日报(2024-06-21) 36氪新闻 「宁王们」出海&#xff0c;钉钉造船 时机已经成熟&#xff0c;“电竞入奥”这次似乎真的要成了 快充与电池容量齐飞&#xff0c;手机体验才能更加均衡 上万块买片叶子&#xff0c;热带植物成为新式潮玩 让哈弗H6破防的价格战&#x…

C++ - 介绍enum的使用

在 C 中&#xff0c;枚举关键字用于定义枚举&#xff0c;枚举是一种用户定义的数据类型&#xff0c;由一组命名的积分常量组成。枚举可以用有意义的名称来表示相关常量的集合&#xff0c;从而提高代码的可读性和可维护性。 In C, the enum keyword is used to define an enumer…

CubeFS - 新一代云原生存储系统

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…