Spring Boot EH Cache如何设置永不过期缓存并实现参数触发重载
EHCache 永不过期配置+手动重载实现方案
关于timeToLiveInMinutes参数的问题
- 不建议通过增大该参数值模拟永不过期效果。该参数在EHCache中接收长整型数值,理论上可配置的最大值换算后约为400万年,看似能满足永不过期需求,但属于取巧实现:一方面后续维护人员很容易误修改该超大配置值,另一方面部分版本EHCache会对超大TTL值做合法性校验,可能启动报错。
- 官方提供了专门的永不过期配置项,不需要靠超大TTL实现。
永不过期缓存的正确配置
EHCache 2.x 版本(Spring Boot 1.x/2.x 常用集成版本)
在ehcache.xml中给对应缓存设置eternal="true"即可,配置后timeToLive、timeToIdle参数会自动失效,缓存条目不会自动过期,示例配置:
<cache name="bizPermanentCache" maxEntriesLocalHeap="2000" eternal="true" memoryStoreEvictionPolicy="LRU"> </cache>
EHCache 3.x 版本
配置缓存时显式指定无过期策略即可,Java配置示例:
@Configuration public class Ehcache3Config { @Bean public CacheManager ehcacheManager() { CachingProvider provider = Caching.getCachingProvider(); javax.cache.CacheManager cacheManager = provider.getCacheManager(); CacheConfiguration<Long, BizData> cacheConfig = CacheConfigurationBuilder .newCacheConfigurationBuilder(Long.class, BizData.class, ResourcePoolsBuilder.heap(2000)) .withExpiry(ExpiryPolicy.NO_EXPIRY) .build(); cacheManager.createCache("bizPermanentCache", Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig)); return new JCacheCacheManager(cacheManager); } }
按参数触发缓存重载的实现
直接通过Spring注入CacheManager实例,拿到目标缓存对象后清空旧数据,重新加载新数据写入即可,参考实现:
@Service public class BizCacheService { @Autowired private CacheManager cacheManager; @Autowired private BizDataQueryService bizDataQueryService; // 自身业务数据源查询服务 /** * 触发永久缓存重载 */ public void reloadPermanentCache() { Cache targetCache = cacheManager.getCache("bizPermanentCache"); if (targetCache == null) { return; } // 清空旧缓存 targetCache.clear(); // 加载全量新数据写入缓存 List<BizData> latestData = bizDataQueryService.loadAllValidData(); latestData.forEach(data -> targetCache.put(data.getId(), data)); } }
如果需要根据应用启动参数触发重载,直接在应用启动流程中读取启动参数判断,调用上述reloadPermanentCache()方法即可;如果是运行时需要动态触发,把该方法对接管理端接口、消息监听逻辑即可。
注意:永不过期缓存需要根据业务数据量合理设置堆内、堆外、磁盘存储的容量阈值,避免出现内存溢出问题。如果缓存数据更新频率极低且数据量大,建议搭配磁盘存储层使用,不要全部存储在堆内存中。
内容的提问来源于stack exchange,提问作者Sajal Saxena
相关产品推荐
相关产品推荐

