为了最大限度地减少数据库查询的数量,我需要某种缓存来存储数据对。我的方法现在是一个哈希表(使用字符串作为键,整数作为值)。但我希望能够检测数据库中的更新并替换“缓存”中的值。我正在寻找的是使我的存储对在预设的时间跨度之后无效,可能是10-15分钟。我该如何实现?我可以使用标准Java包中的某些东西吗?
答案 0 :(得分:4)
我会使用一些现有的解决方案(有许多缓存框架)。 ehcache很棒,它可以在给定的时间跨度内重置值,我敢打赌它可以做更多的事情(我只使用它)
答案 1 :(得分:0)
您可以使用现有解决方案(请参阅上一个回复)
或者,如果您想要挑战,请制作自己的简易缓存课程(不建议用于制作项目,但这是一次很棒的学习体验。
您将需要至少3名成员
存储为哈希表对象的缓存数据
下一个缓存到期日期
通过构造函数设置的缓存到期间隔。
然后简单地使用公共数据getter方法来验证缓存过期状态:
如果没有过期,请致电hastable的访问者;
如果过期,首先调用“数据加载”方法,该方法也在构造函数中调用以预先填充,然后调用哈希表访问器。
对于更酷的缓存类(我在工作中使用Perl实现),您可以使用其他功能实现:
单个按键缓存过期(加上整体缓存过期总量)
自动,半自动和单次数据重新加载(例如,一次重新加载整个缓存;重新加载由某些预定义查询定义的一批数据,或重新加载单个数据元素piecemail)。当你的缓存在相同的密钥上有很多命中时,后一种方法非常有用 - 这样你就不需要在每次访问总是访问的3个kets时重新加载Universe。
答案 2 :(得分:0)
您可以使用OSCache,EHCache,JBoss Cache,JCS等缓存框架...如果您正在寻找符合“标准”的内容,选择支持JCache标准接口(javax.cache)aka JSR-107的框架。
对于像你所描述的简单需求,我会看看EHCache或OSCache(我不是说它们是基本的,但它们很容易开始),它们都支持基于时间的到期。
如果我必须选择一种解决方案,我会推荐Ehcache,这是我的偏好,特别是现在已经加入了Terracotta。只是为了记录,Ehcache通过net.sf.cache.jcache package
提供了a preview implementation JSR107。