Ehcache 刷新缓存不是周期性的而是有条件的

Posted

技术标签:

【中文标题】Ehcache 刷新缓存不是周期性的而是有条件的【英文标题】:Ehcache Refresh cache not periodically but conditional 【发布时间】:2015-05-14 17:53:31 【问题描述】:

我正在使用带有 spring 架构的 ehcache。

现在,我每隔 15 分钟从数据库刷新一次缓存。

@Cacheable(cacheName = "fpodcache",refreshInterval=60000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<Account> getAccount(String key) 
     //Running a database query to fetch the data.

我想要基于条件的缓存刷新,而不是基于时间的缓存刷新。背后有两个原因—— 1. 数据库更新不是很频繁(每天 15 次,但不是固定间隔) 2. 获取和缓存的数据量很大。

因此,我决定维护两个变量 - 数据库中的版本 (version_db) 和缓存中的版本 (version_cache)。我希望设置一个条件,如果(version_db > version_cache)则只刷新缓存,否则不刷新。类似的东西 -

@Cacheable(cacheName = "fpodcache", conditionforrefresh = version_db>version_cache, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<Account> getAccount(String key) 
     //Running a database query to fetch the data.

上面代码中 conditionforrefresh = version_db>version_cache 的正确语法是什么?

我如何做到这一点?

【问题讨论】:

【参考方案1】:

您可以在刷新逻辑的开头进行检查以进行所需的检查。

如果为 true,则从数据库加载,否则使用现有加载的数据。

@Cacheable(cacheName = "fpodcache",refreshInterval=60000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<Account> getAccount(String key) 
 // Fetch version_db
 // Fetch version_cache
 // Check if version_db>version_cache
 // Is true --> Run a database query to fetch the data.
 // Else --> Return existing data

【讨论】:

以上是关于Ehcache 刷新缓存不是周期性的而是有条件的的主要内容,如果未能解决你的问题,请参考以下文章

MyBaits_查询缓存02_Ehcache二级缓存

EhCache缓存框架

mybatis0210 mybatis和ehcache缓存框架整合

使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存

Ehcache 实现 Hibernate 二级缓存策略

Java的应用缓存cache如何入门?