Spring boot基于Ehcache的内存缓存策略实现

news/2025/1/15 15:38:55/

一、Ehcache缓存简介

1、Ehcache基础介绍

EhCache 是一个纯Java的进程内缓存框架,具有快速熟悉、上手简单等特点,是Hibernate框架默认的缓存提供方。

2、Hibernate缓存机制简介

hibernate提供了两级缓存,分别为一级session级缓存策略,二级是SessionFactory对象缓存。在此基础上可以配置三层查询缓存也就是整合此次介绍的Ehcache。

一级缓存:基于session级别的分配的一块内存空间,一般情况下session对象的生命周期对应的是一数据库事物或应用事物,因此它的缓存是事务范围的缓存,是一个必须的缓存。

二级缓存:SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。

三级缓存:查询缓存,配置开启该缓存的情况下,重复使用一个sql查询某个范围内的数据,会进行缓存。

3、EhCache缓存特点

  • 快速,简单,并且提供多种缓存策略;
  • 缓存数据有两级:内存和磁盘,无需担心容量问题;
  • 缓存数据会在虚拟机重启的过程中写入磁盘;
  • 可以通过RMI、可插入API等方式进行分布式缓存;
  • 具有缓存和缓存管理器的侦听接口;
  • 支持多缓存管理器实例,以及一个实例的多个缓存区域;
  • 提供Hibernate的缓存实现;

4、对比redis缓存策略

Ehcache:直接在Jvm虚拟机中缓存,速度快,效率高,不适合处理大规模缓存数据,在分布式环境下,缓存数据共享操作复杂;

Redis:作为独立的缓存中间件,在分布式缓存系统中非常好用,缓存数据共享,有效支撑大量数据缓存,支持哨兵模式,或者集群模式的高可用成熟方案;

二、SpringBoot框架中集成EhCache

1、核心依赖引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId>
</dependency>

2、加载配置文件

spring:cache:ehcache:config: classpath:ehcache.xml

3、配置文件的详情

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><!-- 操作系统缓存的临时目录,内存满后写入该目录 --><diskStore path="java.io.tmpdir"/><defaultCachemaxElementsInMemory="1000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxElementsOnDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence strategy="localTempSwap"/></defaultCache><cache name="UserInfo"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxElementsOnDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence strategy="localTempSwap"/></cache>
</ehcache>

配置参数说明

maxElementsOnDisk:磁盘缓存中最多可以存放的元素数量;

eternal:缓存中对象是否永久有效;

timeToIdleSeconds:当eternal=false时使用,缓存数据有效期(单位:秒),时间段内没有访问该元素,将被清除;

timeToLiveSeconds:缓存数据的存活时间;

maxElementsInMemory:内存中最多可以存放的元素数量,overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中,若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素;

diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔;

memoryStoreEvictionPolicy:缓存释放策略,LRU会优先清理最少使用的缓存;

localTempSwap:持久化策略,当堆内存或者非堆内存里面的元素已经满了的时候,将其中的元素临时的存放在磁盘上,重启后就会消失;

4、启动类的注解配置

@EnableCaching
@SpringBootApplication
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class,args) ;}
}

三、项目中EhCache 注解用法

@Service
public class CacheService {private static final Logger LOGGER = LoggerFactory.getLogger(CacheService.class);@Resourceprivate UserMapper userMapper ;@Cacheable(value="UserInfo")  // 在缓存有效期内,首次查询才访问数据库public UserEntity getById (String id){// 通过日志,标识方法是否执行LOGGER.info("getById..."+id);return userMapper.selectById(id) ;}@CacheEvict(value="UserInfo",key = "#id") //该ID数据更新,清空该ID缓存public void updateUser(String id) {UserInfo user = new UserInfo () ;user.setId(id);user.setUserName("myCache");userMapper.updateById(user);}
}

注解参数说明

@Cacheable:注解标记在一个方法上,也可以标记在一个类上,标记在一个方法上表示该方法支持缓存,该方法被调用后将其返回值缓存起来,下次同样的请求参数执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。

@CacheEvict:注解标记在需要清除缓存元素的方法或类上的,当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,并且可以按照指定属性清除。


http://www.ppmy.cn/news/362236.html

相关文章

Docker 部署升级 Nacos 至 2.2.3 版本解决 raft 漏洞问题

1. 问题描述 nacos 老版本发现有 raft 漏洞&#xff0c;直接升级最新版 2.2.3 解决问题。 2. 升级步骤 拉取最新镜像 docker pull nacos/nacos-server:v2.2.3在原部署参数基础上增加以下三个环境变量 -e NACOS_AUTH_TOKEN-e NACOS_AUTH_IDENTITY_KEY-e NACOS_AUTH_IDENTITY_…

5月5日——一日所学

1. judge_perfect_square(变量) ——>用于判断这个变量能否被开方。

无人船平台介绍

设计一个自主导航的水面无人船导航系统&#xff0c;并能识别水面垃圾并进行打捞&#xff0c;清除水面垃圾。 该系统涉及到电控系统&#xff0c;自主导航模块&#xff0c;深度学习法的图像识别水面垃圾物。

2023中国数字技术算法算力百强榜

胡润研究院联合琶洲实验室&#xff08;黄埔&#xff09;今日于广州市黄埔区发布《2023胡润中国数字技术算法算力百强榜》&#xff08;Hurun China Top 100 Algorithms and Computing Power 2023&#xff09;&#xff0c;列出了算法算力领域最具价值的中国企业100强。 腾讯、阿…

5月7日——一日所学

一.字符串拼接函数的实现原理 思路&#xff1a;1.将两个字符串的首地址传过去&#xff0c;并且将一个字符串的首地址记录下来&#xff08;因为后面会这个地址进行运算&#xff0c;防止丢失&#xff09; 2.找到被拼接字符串的 \0所在地址&#xff0c;将拼接字串每个地址的字符赋…

蚂蚁龙舟赛

“加油&#xff0c;加油”&#xff0c;“太棒了&#xff0c;快赶上了…..”&#xff0c;这天河岸上的蚂蚁分外热闹&#xff0c;原来一年一度的蚂蚁赛龙舟比赛开始了&#xff0c;岸上的蚂蚁观众从四面八方赶来为比赛的选手们加油助威呢。 选手们分成三队&#xff0c;就地取材&a…

神州信息金融核心业务系统信创取得重大进展

近日&#xff0c;神州信息牵头承担的“分布式核心系统在五种信息技术创新组合环境适配研究”项目&#xff0c;经北京金融科技产业联盟创新应用专业委员会综合评审&#xff0c;获通过。 2021年&#xff0c;由北京金融科技产业联盟创新应用专业委员会组织&#xff0c;神州信息牵…

服务器网卡:拥抱开放算力,“碳”索未来

中国拥有最大的互联网用户群体&#xff0c;算力、服务器的需求庞大且增速极快&#xff0c;“新基建”“东数西算”让算力行业腾云而起。随着算力行业创新技术的发展趋势日渐明朗&#xff0c;人们对行业实现可持续发展的重视也与日俱增。同时在百行百业的数字化转型浮现出对数据…