首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:缓存集合

Java:缓存集合
EN

Stack Overflow用户
提问于 2015-07-24 07:06:51
回答 3查看 1.7K关注 0票数 2

让我们支持用java开发应用程序,并有一个大表。为了提高性能,我们需要缓存数据。这里我们有两种缓存方法:

  1. 对象缓存- by id。
  2. 集合缓存-缓存ids的集合(!)

集合缓存的示例。我们有一个sql查询SELECT * FROM person WHERE birhddate=A AND age<B ORDER BY firstName,lastName。对于这个查询,我们缓存ids集合。现在,对于相同的查询,我们可以使用缓存。但是,这种缓存的问题是,如果有任何更新/创建/删除所有的集合,缓存就会过时,不能再使用了。

这些都是问题-

  1. 在实践中是否使用了集合缓存?
  2. java/算法是否有任何模式/解决方案/库来处理集合缓存?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-25 00:47:18

对于问题本身,无论您是在集合中缓存in,还是在集合中缓存对象内容,都无关紧要。

如果对象被更新,它可能不再满足查询条件。

所以我们所说的是缓存查询结果,对吗?

从概念上讲,有许多方法:

  • 更新发生时使整个缓存失效/清除
  • 每当更新表时,使查询结果无效
  • 更新值时:根据旧的和新的对象值评估查询,并更新缓存的结果
  • 不要处理这个问题,在5分钟后使用过期的数据

最简单的选择是清除整个缓存或在过期时工作。这在大多数情况下都能很好地工作。总是从简单的事情开始,然后去寻找更复杂的解决方案,如果这是真正需要的。

顺便说一句:在弹性搜索中,他们实现了您所描述的功能,这就是所谓的"percolator“。请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html

票数 2
EN

Stack Overflow用户

发布于 2015-07-24 07:24:25

了解缓存数据是否“过时”的唯一方法是再次获取数据,从而否定了首先使用缓存的优点。

另一种方法是使用任意的超时值,然后将本地缓存抛出并替换为新数据,这样实现缓存(或“代理”设计模式)的类将在它注意到缓存数据过期时自动获取新数据。

为了考虑这一选择,您可以努力寻找最优值,这应该是记录将改变的预期时间与不刷新数据的最长时间之间的最佳权衡,最大限度地利用缓存带来的利润。

票数 1
EN

Stack Overflow用户

发布于 2015-07-24 13:31:48

Hibernate二级缓存正是这样做的--保持对象缓存,并在发生更新时使其无效。您还可以另外启用存储对象ids的查询缓存。当然,它要求只有应用程序才有对DB的写访问权。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31604273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档