You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:03:23