EehCache介绍、应用场景和示例代码

EhCache 概述

EhCache 是一个高性能、轻量级的 Java 缓存库,广泛应用于各种 Java 应用中。EhCache 提供了丰富的功能,包括内存缓存、磁盘缓存、分布式缓存、持久化等,并且可以和 Spring 框架无缝集成。它支持基于内存和磁盘的混合存储,允许缓存数据在内存满时自动溢出到磁盘。

EhCache 的特点

  • 易于集成:EhCache 易于与 Spring 等框架集成,并提供了直观的配置方式。
  • 高性能:支持多种缓存策略(如 LRU、LFU、FIFO),以优化性能。
  • 可扩展性:支持分布式缓存,可以与 Terracotta 集成实现集群缓存。
  • 灵活性:支持多种存储机制,用户可以根据需求选择在内存、磁盘或两者混合存储缓存数据。

应用场景

  1. 数据层缓存:通过缓存数据库查询结果来减少数据库访问频率,提升应用的响应速度。

  2. Web 应用缓存:缓存网页或部分页面的生成结果,以减少服务器负载。

  3. 计算结果缓存:在计算密集型应用中缓存结果,避免重复计算。

  4. 配置缓存:缓存配置数据,避免频繁访问配置文件或外部配置服务。

示例代码

以下是一个使用 EhCache 进行缓存的简单示例。

1. 引入依赖

pom.xml 中添加 EhCache 和 Spring Cache 的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 配置 EhCache

创建 ehcache.xml 配置文件,放在 src/main/resources 目录下:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"updateCheck="false"monitoring="autodetect"dynamicConfig="true"><cache name="books"maxEntriesLocalHeap="1000"maxEntriesLocalDisk="10000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence strategy="localTempSwap"/></cache></ehcache>
3. 配置 Spring Cache 使用 EhCache

创建 Spring 的缓存配置类:

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic EhCacheCacheManager cacheManager() {net.sf.ehcache.CacheManager ehCacheManager = net.sf.ehcache.CacheManager.newInstance(new ClassPathResource("ehcache.xml").getInputStream());return new EhCacheCacheManager(ehCacheManager);}
}
4. 使用缓存注解

在服务层使用 @Cacheable 注解来缓存方法的返回值:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class BookService {@Cacheable("books")public Book findBookByIsbn(String isbn) {// 模拟耗时操作,如数据库查询simulateSlowService();return new Book(isbn, "Some Book Title");}private void simulateSlowService() {try {Thread.sleep(3000L); // 模拟慢速服务} catch (InterruptedException e) {throw new IllegalStateException(e);}}
}
5. 测试缓存

通过调用服务层方法来测试缓存功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class AppRunner implements CommandLineRunner {@Autowiredprivate BookService bookService;@Overridepublic void run(String... args) throws Exception {System.out.println("Fetching book...");System.out.println(bookService.findBookByIsbn("isbn-1234"));System.out.println("Fetching book again...");System.out.println(bookService.findBookByIsbn("isbn-1234"));}
}
6. 运行结果

第一次调用 findBookByIsbn("isbn-1234") 时,方法会执行并返回结果,同时结果会被缓存。第二次调用时,将直接从缓存中获取数据,不再执行耗时操作。

代码解释

  1. EhCache 配置

    • maxEntriesLocalHeap:设置缓存的最大堆内存条目数。
    • maxEntriesLocalDisk:设置缓存的最大磁盘存储条目数。
    • timeToIdleSecondstimeToLiveSeconds:分别指定缓存条目在闲置和存活时长之后过期。
    • memoryStoreEvictionPolicy:设置内存存储的逐出策略,如 LRU(最近最少使用)。
  2. @EnableCaching:开启 Spring 的缓存支持。

  3. EhCacheCacheManager:将 EhCache 与 Spring Cache 集成。

  4. @Cacheable 注解:标记的方法返回值会被缓存,缓存的 key 是方法参数(如 isbn)。

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

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

相关文章

除了按值和引用,方法参数的第三种传递方式

一、官方描述 三种参数传递方式并非我们杜撰出来的&#xff0c;而是写在.NET最核心的规范文档ECMA-355中&#xff08;I.12.4.1.5&#xff09;&#xff0c;原文如下&#xff1a; The CLI supports three kinds of parameter passing, all indicated in metadata as part of the …

WPS宏实现一个表格拆分成多个表格的功能

把首列名称中一样的分别创建该名称时间戳的新表格&#xff0c;比如有个表格存储各个省的信息&#xff0c;江苏的有50行数据&#xff0c;山西的55行数据等等&#xff0c;这个就是把江苏的创建一个新表保存&#xff0c;山西的创建一个新表格保存。里面主要是表格的创建与关闭相关…

Nginx 优化与防盗链

文章目录 Nginx 优化与防盗链一、隐藏版本号1.1 修改配置文件方式1.1.1 操作步骤 1.2 修改源码方式1.2.1 操作步骤 二、修改用户与组2.1 操作步骤 三、缓存时间3.1 操作步骤 四、日志切割4.1 操作步骤 五、连接超时5.1 操作步骤 六、更改进程数6.1 操作步骤 七、配置网页压缩7.…

【论文分享】Graviton: Trusted Execution Environments on GPUs 2018’OSDI

目录 AbstractIntroductioncontributions BackgroundGPUSoftware stackHardwareContext and channel managementCommand submissionProgramming modelInitializationMemory allocationHost-GPU transfersKernel dispatch Sharing Intel SGX Threat ModelOverviewGraviton Archi…

CLIP-VIT-L + Qwen 多模态源码阅读 - 语言模型篇(3)

多模态学习笔记 - 语言模型篇&#xff08;3&#xff09; 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 吐槽 今天接着昨天的源码继续看&#xff0c;黑神话&#xff1a;悟空正好今天发售&#xff0c;希望广大coder能玩的开心~ 学习心得 前情提要 详情请看多模态…

设计模式笔记01(java版)

文章目录 设计模式概述学习设计模式的必要性设计模式分类创建型模式结构型模式行为型模式 UML类图概述类图的作用类图表示法类的表示方式类与类之间关系的表示方式1&#xff0c;单向关联2&#xff0c;双向关联3&#xff0c;自关联聚合关系组合关系依赖关系继承关系实现关系 软件…

Pytorch 张量运算函数(补充)

mean() mean()函数是进行张量均值计算的函数,常用参数可以设置参数dim来进行对应维度的均值计算 以下是使用一个二维张量进行演示的例子 import numpy as np import torch device torch.device(mps if torch.backends.mps.is_available() else cpu) print(device ) data1 …

C++ | Leetcode C++题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPerfectSquare(int num) {double x0 num;while (true) {double x1 (x0 num / x0) / 2;if (x0 - x1 < 1e-6) {break;}x0 x1;}int x (int) x0;return x * x num;} };

linux系统,ubuntu安装英伟达NVIDIA4090显卡驱动

文章目录 前言下载英伟达NVIDIA官方驱动安装NVIDIA驱动远程安装关闭交互界面设置权限&#xff08;自己确认版本号5&#xff09;安装&#xff08;自己确认版本号5&#xff09;打开交互界面&#xff0c;并重启系统验证是否安装成功 异常处理问题1问题2问题3&#xff08;可能没解决…

Linux 支持程序在运行时动态加载和卸载共享库,动态链接库

动态链接库 Linux支持动态链接库&#xff08;共享库&#xff09;的概念&#xff0c;允许程序在运行时动态加载和卸载共享库。这有助于减小可执行文件的大小&#xff0c;共享代码&#xff0c;提高代码的可重用性。 #include <dlfcn.h> #include <iostream>int mai…

python小游戏——躲避球(可当课设)

游戏简介&#xff1a; 没有美术&#xff0c;画面简洁&#xff08;懒得做&#xff09;。玩家控制小球躲避敌人&#xff08;上下左右&#xff0c;闪避&#xff09;&#xff0c;敌人体积越大速度越慢&#xff0c;随机生成道具球&#xff08;目前只有生命球&#xff09;&#xff0…

day_49

42. 接雨水 class Solution:def trap(self, height: List[int]) -> int:stack []res 0for i in range(len(height)):while(stack and height[i] > height[stack[-1]]):mid stack.pop()if stack:h min(height[i], height[stack[-1]]) - height[mid]w i - stack[-1] …

​14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Redis内存淘汰

Redis内存淘汰 Redis可以存储多少数据 maxmemory配置&#xff0c;默认是注释掉的。 #maxmemory <bytes>我们可以主动配置maxmemory&#xff0c;maxmemory支持各种单位&#xff0c;默认是字节 maxmemory 1024 maxmemory 1024KB maxmemory 1024MB maxmemory 1024GB当Re…

跟着GPT学习 Kubernetes ,简称 K8s -- Kind(三)

在 Mac M1 上使用 Kind&#xff08;Kubernetes in Docker&#xff09;学习 Kubernetes 是一个非常合适的选择&#xff0c;因为 Kind 可以在本地轻松地创建一个 Kubernetes 集群&#xff0c;适合进行开发、测试和学习。让我们一步一步地从头开始&#xff0c;设置你的环境并逐步学…

shallowReactive 与 shallowRef

除了之前的 ref与reactive 之外&#xff0c;Vue3 还准备了另外两个API&#xff0c;也是用来对响应式数据做处理&#xff0c;那就是 shallowReactive 与 shallowRef shallowReactive 文档解释&#xff1a;reactive() 的浅层作用形式&#xff0c;只能定义对象类型的数据。和 r…

Spring Boot整合Sentry

Spring Boot整合Sentry Sentry搭建Sentry中新建项目集成SpringBoot1. 添加依赖2. 配置Sentry4. 日志集成&#xff08;可选&#xff09;5. 测试Sentry集成6. 配置实时告警配置Alert Settings配置警报规则 发送消息服务代码参照文档 Sentry 是一个日志平台&#xff0c;分为客户端…

AI 未来两年:史无前例的变革与挑战

2024 年 8 月 20 日&#xff0c;正站在科技变革的风暴中心&#xff0c;见证着人工智能&#xff08;AI&#xff09;以惊人的速度重塑着世界。谷歌前 CEO Eric Schmidt 对 AI 未来两年的预测&#xff0c;引起了广泛关注&#xff0c;如今 YC 的 CEO Garry Tan 也高度赞同这些观点&…

CMakeLists.txt模板

#设置编译该CMakeLists.txt文件所需要的最低cmake版本 CMAKE_MINIMUM_REQUIRED(VERSION 最低版本号)# 该项目名称 PROJECT(项目名称)SET(CMAKE_CXX_STANDARD 11)SET(CMAKE_C_STANDARD 11)# 此行可以理解为将路径下所有的文件装载到自定义集合filelist中 FILE(GLOB filelist &q…

Vite + Vue 3 项目中实现路由自动化完整步骤。

下面是从创建项目到实现路由自动化的完整步骤 在 Vite Vue 3 项目中实现路由自动化可以通过使用文件系统路由生成器来简化路由管理过程。以下是实现路由自动化的完整步骤&#xff1a; 1.创建 Vite Vue 3 项目 如果你还没有一个 Vite Vue 3 项目&#xff0c;可以使用以下命令…