ehcache使用学习
在JVM缓存中有一个经常使用的缓存框架,就是
encache
,所以这里对encache进行一些介绍,本文是基于版本3.8来介绍一些新特性。
encache的分层结构
在正式使用encache
的时候,我们先来了解一下其缓存策略,也就是其缓存的值究竟是存在哪里的,这有助于我们理解encache
。其有三种缓存策略分别是堆内缓存、堆外缓存、磁盘缓存,分别对应的分层结构配置是heap
、offheap
、disk
。
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.8.0</version> </dependency>
1、通过Java代码配置使用
我们可以使用java代码来获取Cache
实例。
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()//声明一个cacheBuilder .withCache("myCache",CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20)))//声明一个容量为20的堆内缓存 .build(true); Cache<String,String> myCache = cacheManager.getCache("myCache",String.class,String.class);//获取这个cache myCache.put("key1","v1");//使用 System.out.println(myCache.get("key1")); //移除 cacheManager.removeCache("myCache"); cacheManager.close();
2、通过xml配置使用
//获取配置资源 URL configUrl = new XmlGetStarted().getClass().getResource("/cache.xml"); //从xmlConfig构造一个CacheManger并且初始化 Configuration xmlConfig = new XmlConfiguration(configUrl); CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig); cacheManager.init(); Cache<String,String> cache = cacheManager.getCache("c1",String.class,String.class); cache.put("K","V"); System.out.println(cache.get("K"));
数据更新
在配置
CacheConfiguration
时,我们可以配置缓存的Expiry
,也就是过期策略,具体配置代码如下:
CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20)) .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(20)));
encache
过期策略有三种,分别是:timeToLiveExpiration
:从创建cache entry开始计算,一段时间后过期timeToIdleExpiration
: 从最后一次访问cache entry开始计算,只有heap里的cache entry生效noExpiration
: 永不过期将缓存数据序列化到磁盘
可以使用encache
分层结构的disk
来序列化数据。
long begin = System.currentTimeMillis(); PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData")))//序列化到磁盘的路径 .withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .disk(500, MemoryUnit.MB, true) )//声明单个cache的配置 ) .build(true); Cache<Long,String> cache = persistentCacheManager.getCache("persistent-cache",Long.class, String.class); for (int i=0;i<SIZE;i++){ cache.put(Long.valueOf(i),String.valueOf(i)); System.out.println(cache.get(Long.valueOf(i))); } System.out.println("cost time:"+(System.currentTimeMillis()-begin)); persistentCacheManager.close();
这样,在persistentCacheManager.close()
就会将缓存自动刷新到磁盘,启动时会将磁盘中的数据进行加载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具