Java 本地缓存实现:Guava Cache、Caffeine、Ehcache 和 Spring Cache

文章目录

    • 一、引言
    • 二、Guava Cache
      • 理论介绍
      • 实战演示
    • 三、Caffeine
      • 理论介绍
      • 实战演示
    • 四、Ehcache
      • 理论介绍
      • 实战演示
    • 五、Spring Cache
      • 理论介绍
      • 实战演示
    • 六、总结

一、引言

在现代应用程序开发中,缓存是提高性能和响应速度的关键技术之一。Java 提供了多种本地缓存解决方案,每种方案都有其特点和适用场景。本文将介绍四种常见的 Java 本地缓存实现:Guava Cache、Caffeine、Ehcache 和 Spring Cache。

在这里插入图片描述

二、Guava Cache

理论介绍

Guava Cache 是 Google Guava 库的一部分,提供了轻量级的本地缓存功能。它具有以下特点:
简单易用:API 设计简洁,易于集成到项目中。
自动回收:支持基于时间或引用的自动回收机制。
并发支持:内置高效的并发控制,适合多线程环境。

实战演示

pom

<dependencies><!-- Guava Cache --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1-jre</version> </dependency>
</dependencies>

示例代码

/*** LocalCacheTest* @author senfel* @version 1.0* @date 2024/12/20 17:17*/
@SpringBootTest
public class LocalCacheTest {/*** guavaCache* @author senfel* @date 2024/12/20 17:19* @return void*/@Testpublic void guavaCache() throws Exception{LoadingCache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) {return "Value for " + key;}});System.out.println(cache.get("key1")); // 输出: Value for key1}

三、Caffeine

理论介绍

Caffeine 是一个高性能的本地缓存库,继承了 Guava Cache 的优点并进行了优化。它的特点包括:
高性能:比 Guava Cache 更快,特别是在高并发环境下。
灵活配置:支持多种缓存策略,如 LRU(最近最少使用)、LFU(最不经常使用)等。
内存友好:通过弱引用和软引用来减少内存占用。

实战演示

pom

<dependencies><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.3</version></dependency>
</dependencies>

示例代码

/*** caffeineCache* @author senfel* @date 2024/12/20 17:25* @return void*/
@Test
public void caffeineCache() throws Exception{Cache<String, String> cache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(10, TimeUnit.MINUTES).build();cache.put("key1", "value1");System.out.println(cache.getIfPresent("key1")); // 输出: value1
}

四、Ehcache

理论介绍

Ehcache 是一个广泛使用的开源缓存框架,适用于分布式和非分布式环境。它的特点有:
丰富的特性:支持多种缓存策略、持久化、集群等功能。
配置灵活:可以通过 XML 或注解进行配置。
社区活跃:拥有庞大的用户群体和活跃的社区支持。

实战演示

pom

<dependencies><!-- Ehcache 核心库 --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.6</version></dependency><!-- Ehcache 的 web 集群分布式缓存的支持 --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-web</artifactId><version>2.0.4</version></dependency>
</dependencies>

ehcache.xml

<!-- ehcache.xml -->
<ehcache><cache name="exampleCache"maxEntriesLocalHeap="100"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"/>
</ehcache>

示例代码

/*** ehcacheCache* @author senfel* @date 2024/12/20 17:31* @return void*/
@Test
public void ehcacheCache() throws Exception{CacheManager cacheManager = CacheManager.create("D:\\workspace\\cce-demo\\src\\main\\resources\\ehcache.xml");Ehcache cache = cacheManager.getCache("exampleCache");cache.put(new Element("key1", "value1"));System.out.println(cache.get("key1").getObjectValue()); // 输出: value1
}

五、Spring Cache

理论介绍

Spring Cache 是 Spring 框架提供的缓存抽象层,可以与多种缓存实现无缝集成。它的特点包括:
声明式缓存:通过注解简化缓存逻辑的实现。
高度集成:与 Spring 生态系统紧密集成,方便与其他组件协同工作。
灵活选择:支持多种缓存提供者,如 ConcurrentMapCache、Ehcache、Caffeine 等。

实战演示

pom

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.3</version>
</dependency>

yaml

spring:cache:type: caffeinecaffeine:spec: maximumSize=100,expireAfterWrite=10m

示例代码

/*** CacheService* @author senfel* @version 1.0* @date 2024/12/20 17:45*/
@Service
public class CacheService {/*** getData* @param key* @author senfel* @date 2024/12/20 17:53* @return java.lang.String*/@Cacheable(value = "myCache")public String getData(String key) {// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "Value for " + key;}
}
@Resource
private CacheService cacheService;/*** testCache* @param key* @author senfel* @date 2024/12/20 18:00* @return java.lang.String*/
@RequestMapping("/testCache")
public String  testCache(String key) {return  cacheService.getData(key);
}

六、总结

综上所述,Guava Cache 简单易用,自动回收 ,适合小型应用,对性能要求不高;Caffeine高性能,灵活配置 高并发环境,适合对性能敏感的应用;Ehcache功能丰富,配置灵活,适合分布式系统,需要复杂缓存策略;Spring Cache 是声明式缓存,高度集成 ,适合Spring 应用,需要快速集成缓存。在实际的开放中,我们可以根据具体需求选择合适的缓存方案,可以显著提升应用程序的性能和用户体验。

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

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

相关文章

计算机网络B重修班-期末复习

[TOC] (计算机网络B重修班-期末复习&#xff09; 一、单选 &#xff08;20题&#xff0c;1分/题&#xff0c;共20分&#xff09; 二、判断 &#xff08;10题&#xff0c;1分/题&#xff0c;共10分&#xff09; 三、填空 &#xff08;10题&#xff0c;1分/题&#xff0c;共10…

QT的前景与互联网岗位发展

qt是用来干什么的 --》桌面应用开发&#xff08;做电脑的应用程序&#xff0c;面对客户端&#xff09;。 主要用于开发跨平台的应用程序和用户界面&#xff08;UI&#xff09;。它是一个全面的C库集合&#xff0c;提供了构建软件应用所需的各种工具和功能。 客户端开发的重…

重温设计模式--单例模式

文章目录 单例模式&#xff08;Singleton Pattern&#xff09;概述单例模式的实现方式及代码示例1. 饿汉式单例&#xff08;在程序启动时就创建实例&#xff09;2. 懒汉式单例&#xff08;在第一次使用时才创建实例&#xff09; 单例模式的注意事项应用场景 C代码懒汉模式-经典…

Java字符串的|分隔符转List实现方案

字符串处理 问题背景代码实现代码优化原因分析实现方案 注意事项异常处理Maven未识别异常 问题背景 在项目组对账流程中&#xff0c;接收对方系统的对账文件&#xff0c;数据以|为分隔符&#xff0c;读取文件内容&#xff0c;分条入库。 代码实现 Java中将字符串转给list&am…

项目底链华为链切换长安链经验总结

项目底链华为链切换长安链经验总结 前言业务需求分析智能合约重写k-v存储结构设计设计上链存储的结构体使用迭代器查询历史记录长安链合约编辑器历史记录返回错误材料上链非必传字段 Int 类型自动赋值长安链cmc工具部署合约ca证书需齐全分页查询截取处理&#xff0c;返回 nil处…

【机器学习】从流动到恒常,无穷中归一:积分的数学诗意

文章目录 微积分基础&#xff1a;理解变化与累积的数学前言一、积分概述与基础概念1.1 积分的定义与重要性1.1.1 积分的基本组成1.1.2 积分在机器学习中的应用 1.2 积分的历史与发展 二、积分的基本概念与计算2.1 不定积分2.1.1 不定积分的定义2.1.2 不定积分的计算方法2.1.3 实…

在瑞芯微RK3588平台上使用RKNN部署YOLOv8Pose模型的C++实战指南

在人工智能和计算机视觉领域,人体姿态估计是一项极具挑战性的任务,它对于理解人类行为、增强人机交互等方面具有重要意义。YOLOv8Pose作为YOLO系列中的新成员,以其高效和准确性在人体姿态估计任务中脱颖而出。本文将详细介绍如何在瑞芯微RK3588平台上,使用RKNN(Rockchip N…

电磁兼容(EMC):一文解读磁芯复合材料——塑磁

目录 01 塑磁的定义 02 塑磁的常见规格型号 03 塑磁材料的优点 04 塑磁的应用 塑磁,也称为注塑磁,是一种将磁性粉末注入到塑料基体中制成的复合磁体材料。以下是塑磁的定义、应用和材料特性的总结: 01 塑磁的定义 塑磁是以塑料为基体,通过特殊工艺在其中加入磁性粒子(…

五种msvcr100.dll丢失的解决方法,有效修复msvcr100.dll丢失错误!跟msvcr100.dll错误问题说拜拜!

在日常电脑使用过程中&#xff0c;尤其是运行某些应用程序或游戏时&#xff0c;可能会遇到“msvcr100.dll丢失”的错误提示。这个动态链接库&#xff08;DLL&#xff09;文件是Microsoft Visual C Redistributable for Visual Studio 2010的一部分&#xff0c;对于许多程序的正…

redis数据类型:list

数据结构 源码版本&#xff1a;7.2.2路径&#xff1a;src/adlist.h 关于list的 头文件中涉及到的这三个结构体如下 /* Node, List, and Iterator are the only data structures used currently. */ # 节点 typedef struct listNode {struct listNode *prev; # 前元素的指针s…

计算机网络(网络层)

1、ARP协议(已知ip地址得到mac地址) 在传输一个 IP 数据报的时候&#xff0c;确定了源 IP 地址和目标 IP 地址后&#xff0c;就会 通过主机「路由表」确定 IP 数据包下一跳。然而&#xff0c;网络层的下一层是数据链路层&#xff0c;所以我们还要知道「下一跳」的 MAC 地址。由…

Linux下学【MySQL】表中插入和查询的进阶操作(配实操图和SQL语句通俗易懂)

绪论​ 每日激励&#xff1a;挫折是会让我们变得越来越强大的重点是我们敢于积极的面对它。—Jack叔叔 绪论​&#xff1a; 本章是表操作的进阶篇章&#xff08;没看过入门的这里是传送门&#xff0c;本章将带你进阶的去学习表的插入insert和查找select&#xff0c;本质也就是…

[Rust开发]actix_webmiddleware 中间件

actix_web::middleware 在 Actix Web 框架中扮演着重要的角色&#xff0c;它允许开发者在处理 HTTP 请求和响应的过程中插入自定义的逻辑。中间件可以在请求到达处理函数之前或响应返回给客户端之前执行&#xff0c;从而实现日志记录、身份验证、数据验证、错误处理等功能。 为…

WebLogic T3反序列化漏洞(CVE-2018-2628)--vulhub

WebLogic T3反序列化漏洞(CVE-2018-2628) WebLogic在通信过程中使用T3协议传输数据&#xff0c;涉及到了序列化和反序列化操作。 T3协议概述 T3协议是Oracle的私有协议&#xff0c;所以公开的相关资料比较少&#xff0c;这里结合其他师傅的博客简单对T3协议进行一个简要分析…

OpenFeign快速入门 示例:黑马商城

使用起因 之前我们利用了Nacos实现了服务的治理,利用RestTemplate实现了服务的远程调用。这样一来购物车虽然通过远程调用实现了调用商品服务的方法,但是远程调用的代码太复杂了: 解决方法 并且这种调用方式比较复杂&#xff0c;一会儿远程调用&#xff0c;一会儿本地调用。 因…

计算机的错误计算(一百九十)

摘要 用两个大模型计算cot(1.234). 其中&#xff0c;1.234是以弧度为单位的角度。结果保留10位有效数字。实验表明&#xff0c;两个的计算公式虽然不同&#xff0c;但是都是正确的。然而&#xff0c;数值计算则是有问题的---包括每一个中间运算与结果。 例1. 计算cot(1.234)…

【QSS样式表 - ⑥】:QPushButton控件样式

文章目录 QPushBUtton控件样式QSS示例 QPushBUtton控件样式 常用子控件 常用伪状态 QSS示例 代码&#xff1a; QPushButton {background-color: #99B5D1;color: white;font-weigth: bold;border-radius: 20px; }QPushButton:hover {background-color: red; }QPushButton:p…

深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)

计算机视觉从小白到大师之路 《深度学习与图像处理&#xff08;PaddlePaddle版&#xff09;》这一本就够了 1.引言 随着人工智能技术的飞速发展&#xff0c;各行各业对深度学习、图像处理相关领域的人才需求日益迫切。本书旨在通过系统的理论讲解与丰富的实战案例&#xff0…

HCIA-Access V2.5_6_3_GPON关键技术

GPON关键技术 GPON关键技术包含三个&#xff0c;测距&#xff0c;DBA&#xff0c;下行AES加密。 为什么需要测距 由于每一个ONU到OLT的距离是不一样的&#xff0c;虽然上行有TDMA技术&#xff0c;让每一个ONU在不同的时间段发送数据&#xff0c;但是可能由于距离的原因&#x…

v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。

一、背景、目的、简介。 一般来说&#xff0c;通过uboot将屏幕参数传给kernel&#xff0c;是通过修改设备树。 uboot和kernel都需要屏幕点亮。uboot侧重于显示一张图片。而kernel则多是动画。 在这里&#xff0c;我先是找到了一个裸机点屏的代码。将其编译成静态库后&#x…