本地缓存Ehcache的应用实践 | 京东云技术团队

💡 原文中文,约9900字,阅读约需24分钟。
📝

内容提要

本文介绍了Java本地缓存框架Ehcache的特点和用法,包括内存和磁盘缓存、集成性、配置选项和缓存策略。Ehcache还支持分布式缓存和与其他缓存系统集成。文章提供了使用示例和测试代码。

🔎

延伸解读

分层存储的权衡与选择

Ehcache支持堆内存、堆外存储、磁盘存储和集群存储。堆内存速度最快但受GC影响且资源有限;堆外存储不受GC但速度稍慢;磁盘存储资源丰富但速度较慢,建议使用SSD;集群存储因网络延迟性能较低。实际应用中可根据数据访问频率和性能要求组合使用,如堆内存+堆外存储+本地磁盘。

持久化磁盘的注意事项

使用Ehcache的磁盘持久化时,系统退出前必须调用persistentCacheManager.close()释放资源,否则磁盘数据可能不准确。重启后,缓存数据会从磁盘加载,在有效期内依然有效,这可以减少应用启动时对后端数据库的压力。但需注意磁盘IO可能成为性能瓶颈。

分布式场景下的局限性

Ehcache可结合Terracotta插件实现分布式存储,但其分布式实现并不可靠,核心采用广播集群方式同步数据,性能受机器IO、磁盘、网络等影响。对于线上系统,若需分布式存储,建议直接使用Redis,因为Ehcache的分布式性能通常不如Redis。

❓

Q&A

Ehcache 支持哪些存储层级?

Ehcache 支持分层存储,包括堆内存储(利用 JVM 堆内存,受 GC 影响,速度快但资源有限)、堆外存储(受可用 RAM 限制,不受 GC 影响,速度比堆上慢)、磁盘存储(利用文件系统,资源丰富但速度较慢,建议使用 SSD)以及集群存储(分布式远程服务器,有网络延迟,性能较低)。

Ehcache 的有效期策略有哪些?

Ehcache 提供四种有效期策略:没有期限(永不过期)、生存周期(创建后固定时间过期)、空闲时间(上次访问后固定时间过期)以及定制有效期(通过重载 ExpiryPolicy 接口实现个性化过期判断)。

Ehcache 的淘汰策略有哪些?

Ehcache 支持三种淘汰策略:LFU(淘汰访问频率最低的缓存)、LRU(基于最近访问时间淘汰)和 FIFO(按数据项最早进入缓存的时间淘汰)。

Ehcache 如何实现持久化到磁盘?

Ehcache 通过 PersistentCacheManager 和 CacheManagerBuilder.persistence 方法指定磁盘存储路径,并在缓存配置中使用 ResourcePoolsBuilder 添加 .disk() 层来实现持久化。系统退出前需调用 persistentCacheManager.close() 释放资源以保证磁盘数据准确,重启后会加载磁盘数据至缓存。

Ehcache 的分布式存储可靠吗?与 Redis 相比如何?

Ehcache 可结合 Terracotta 插件实现分布式存储,但其分布式实现并不可靠,核心采用广播集群方式同步数据,性能受机器 IO、磁盘、网络等影响。对于线上系统,若需分布式存储,建议直接使用 Redis,因为 Ehcache 的分布式性能不会比 Redis 更好。

如何使用 Ehcache 创建一个三层存储并持久化磁盘的缓存实例?

使用 CacheManagerBuilder.newCacheManagerBuilder() 创建 PersistentCacheManager,通过 .with(CacheManagerBuilder.persistence(new File("路径", "缓存名"))) 指定持久化目录,然后使用 .withCache() 配置缓存,在 ResourcePoolsBuilder 中依次添加 .heap(10, EntryUnit.ENTRIES)、.offheap(1, MemoryUnit.MB) 和 .disk(20, MemoryUnit.MB, true) 来定义堆内存、堆外存储和磁盘存储。最后调用 .build(true) 构建。

🏷️

标签

➡️

继续阅读