我正在使用Spring框架和Java CXF服务。
我的项目要求每 15 分钟从数据库刷新一次缓存。从数据库中提取数据平均需要一分钟。因此,虽然这一分钟操作(缓存正在从数据库刷新),但如果我尝试访问缓存,它应该返回以前存储的值。
时间线去 ->
0 分钟:应用程序启动。缓存刷新的触发器。
0.5 分钟:正在通过查询数据库加载缓存
1 分钟:缓存加载(例如:xyz)
5 分钟:访问缓存并返回 xyz
15 分钟:缓存应刷新(新的缓存值将在 16 分钟时为 xyw)
15.5 分钟:正在通过查询数据库加载缓存。此时,如果访问缓存,它应返回以前的缓存值,因为新缓存现在处于不一致状态。(应返回 xyz)
16 分钟:缓存重新加载。如果现在访问,则应返回 xyq。
我有两个问题:
- 现在我有一个 Spring 任务调度程序,每 15 分钟进行一次缓存刷新。我可以用ehcache本身吗?
我的 ehcache.xml 看起来像:
<ehcache> <cache name="mycache" maxElementsInMemory="3000" eternal="false" timeToIdleSeconds="60000" timeToLiveSeconds="60000" overflowToDisk="true" diskPersistent="false" /> <persistence strategy="localTempSwap" synchronousWrites="true" /> </cache> </ehcache>
- 如何实现此缓存的行为方式,如描述的 15.5 分钟?
答案:
- Ehcache有一个使用Quartz调度程序的计划刷新装饰器。有关如何使用它,请参阅此文档。
- Ehcache 不会提供此行为,除非您使刷新过程成为事务性。否则,您将在获得密钥时点击映射到密钥的任何值。