【发布时间】:2009-09-19 22:44:12
【问题描述】:
为了尽量减少数据库查询的数量,我需要某种缓存来存储数据对。我现在的方法是一个哈希表(字符串作为键,整数作为值)。但我希望能够检测数据库中的更新并替换我的“缓存”中的值。我正在寻找的是在预设时间跨度(可能是 10-15 分钟)后使我存储的对无效的东西。我将如何实施?我可以使用标准 Java 包中的内容吗?
【问题讨论】:
为了尽量减少数据库查询的数量,我需要某种缓存来存储数据对。我现在的方法是一个哈希表(字符串作为键,整数作为值)。但我希望能够检测数据库中的更新并替换我的“缓存”中的值。我正在寻找的是在预设时间跨度(可能是 10-15 分钟)后使我存储的对无效的东西。我将如何实施?我可以使用标准 Java 包中的内容吗?
【问题讨论】:
我会使用一些现有的解决方案(有很多缓存框架)。 ehcache 很棒,它可以重置给定时间跨度的值,我敢打赌它可以做得更多(我只用过)
【讨论】:
您可以使用现有的解决方案(请参阅之前的回复)
或者,如果您想要挑战,制作自己的简单缓存类(不推荐用于生产项目,但这是一次很棒的学习体验。
您至少需要 3 名成员
存储为哈希表对象的缓存数据,
下一个缓存到期日期
通过构造函数设置缓存过期间隔。
然后简单地使用公共数据 getter 方法来验证缓存过期状态:
如果没有过期,调用 hastable 的访问器;
如果过期,首先调用构造函数中也调用的“数据加载”方法进行预填充,然后调用哈希表访问器。
对于一个更酷的缓存类(我在工作中使用 Perl 实现了它),您可以实现其他功能:
单独的每个键缓存过期(加上总缓存过期)
自动、半自动和单次数据重新加载(例如,一次重新加载整个缓存;重新加载由某些预定义查询定义的一批数据,或重新加载单个数据元素片段邮件)。当您的缓存对相同的确切键有多次命中时,后一种方法非常有用 - 这样您就不需要在每次总是访问的 3 个 ket 过期时重新加载 Universe。
【讨论】:
您可以使用像OSCache、EHCache、JBoss Cache、JCS 这样的缓存框架...如果您正在寻找遵循“标准”的东西,请选择支持 JCache 标准的框架接口(javax.cache)又名JSR-107。
对于您所描述的简单需求,我会考虑 EHCache 或 OSCache(我不是说它们是基本的,但它们很容易上手),它们都支持基于时间的过期。
如果我必须选择一种解决方案,我会推荐我喜欢的 Ehcache,尤其是现在它已加入 Terracotta。并且为了记录,Ehcache 通过net.sf.cache.jcache package 提供了JSR107 的a preview implementation。
【讨论】: