论坛首页 Java企业应用论坛

Ehcache定时刷新

浏览 9937 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-20  

之前的文章介绍了在项目里使用Ehcache的经历,现在它可以很好的工作。但是现在用户来新需求了(他们一直有新需求的):

需要缓存定时刷新,如10:00,12:00,17:30.....(具体时间点用户给定),请注意是定时刷新,那么意味着缓存不但要失效,而且要能将新的数据填充的缓存里。

以往我们做的程序,是配置缓存多长时间(多少秒)失效,等用户再次请求后根据请求结果刷新缓存。看了一下ehcache的文档,好像未找到相应的内容。

解决办法:

目前暂时依赖容器做定时任务,通过代码刷新缓存。

更好的解决办法:

扩展(也许ehcache或者其他大牛已经做了)ehcache,使其能定时是缓存实效,并提供一个公共的接口,让业务代码实现,用于在缓存失效后立即刷新缓存。我的扩展方法不知道是否可行呢?或者大牛们有什么更好的实现,希望告知。。。

   发表时间:2007-04-20  
那能不能做成是留一个监听的接口,在该缓存用到的相关信息改变时才刷新缓存,比如缓存了用户权限判断等,当管理员对某个用户的权限做了重新设置,此时相应的刷新缓存。
0 请登录后投票
   发表时间:2007-04-20  
偶们之前也有类似的需求,在ehcache mail list上问了,开发人员认为是一个性价比很低的功能,用任何schedule lib调用一下ehcache的clear API就搞定了,没有必要让ehcache为了这个小功能而引入额外的依赖。
0 请登录后投票
   发表时间:2007-04-20  
Readonly 写道
偶们之前也有类似的需求,在ehcache mail list上问了,开发人员认为是一个性价比很低的功能,用任何schedule lib调用一下ehcache的clear API就搞定了,没有必要让ehcache为了这个小功能而引入额外的依赖。


的确,我现在的做法就是用schedule定时调用cache remove。只是这种需求多了,就要为了cache的定时刷新写一堆类似的代码。无论cache是否支持,工作其实没有少,因为要在clear cache之后及时将新的数据写入cache,而这个事只能自己定制代码。
0 请登录后投票
   发表时间:2007-04-20  
former 写道
Readonly 写道
偶们之前也有类似的需求,在ehcache mail list上问了,开发人员认为是一个性价比很低的功能,用任何schedule lib调用一下ehcache的clear API就搞定了,没有必要让ehcache为了这个小功能而引入额外的依赖。


的确,我现在的做法就是用schedule定时调用cache remove。只是这种需求多了,就要为了cache的定时刷新写一堆类似的代码。无论cache是否支持,工作其实没有少,因为要在clear cache之后及时将新的数据写入cache,而这个事只能自己定制代码。


难道你们的cache不是透明调用的吗?调用clear API以后,只需要调用一下使用了这个cache的方法,方法里面判断到cache中没有的话,就把执行的结果放入到cachae中了。
不过是写一个schedule job,然后配置一下,让它知道清理哪个cache,调用哪个方法而已,不需要一堆类似的代码。
0 请登录后投票
   发表时间:2007-04-20  
Readonly 写道
former 写道
Readonly 写道
偶们之前也有类似的需求,在ehcache mail list上问了,开发人员认为是一个性价比很低的功能,用任何schedule lib调用一下ehcache的clear API就搞定了,没有必要让ehcache为了这个小功能而引入额外的依赖。


的确,我现在的做法就是用schedule定时调用cache remove。只是这种需求多了,就要为了cache的定时刷新写一堆类似的代码。无论cache是否支持,工作其实没有少,因为要在clear cache之后及时将新的数据写入cache,而这个事只能自己定制代码。


难道你们的cache不是透明调用的吗?调用clear API以后,只需要调用一下使用了这个cache的方法,方法里面判断到cache中没有的话,就把执行的结果放入到cachae中了。
不过是写一个schedule job,然后配置一下,让它知道清理哪个cache,调用哪个方法而已,不需要一堆类似的代码。


应该是我没说清楚。之前cache的确是所谓透明调用,执行某个业务方法后触发cache。现在,需求是:假设cache中有X个element,那么根据某个规则,其中Y个需要定时刷新,X-Y个需要间隔Z秒刷新。我之前考虑是否可以用2个cache来分别处理,后来发现无论怎么处理,都要对这些element的key做判断,于是说“为了cache的定时刷新写一堆类似的代码”,并不是说cache刷新繁琐,纯粹是业务。

另外,您之前说:
Readonly 写道
没有必要让ehcache为了这个小功能而引入额外的依赖。

是指对schedule lib的依赖吗?那么它现在用于间隔多少秒刷新的做法,又是依赖什么呢?这个我会看一下。
0 请登录后投票
   发表时间:2007-04-20  
不是刷新,而是失效,目前ehcache的策略是放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较一下就可以了,

偶们遇到的问题,如果想要通过扩展ehcache来实现,也可以用类似的方法:在取的时候需要同设置的时间点做比较,如果跨越了1个时间段,就失效了。这样就不需要在每个时间点都去清理cache,因为很有可能在N个时间段内,压根没有Hit。这样做的麻烦在于怎么解析设置cron job一样的表达式...所以偶还是宁愿用现成的schedule lib来做主动清理的动作。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics