让我们支持用java开发应用程序,并有一个大表。为了提高性能,我们需要缓存数据。这里我们有两种缓存方法:
集合缓存的示例。我们有一个sql查询SELECT * FROM person WHERE birhddate=A AND age<B ORDER BY firstName,lastName。对于这个查询,我们缓存ids集合。现在,对于相同的查询,我们可以使用缓存。但是,这种缓存的问题是,如果有任何更新/创建/删除所有的集合,缓存就会过时,不能再使用了。
这些都是问题-
发布于 2015-07-25 00:47:18
对于问题本身,无论您是在集合中缓存in,还是在集合中缓存对象内容,都无关紧要。
如果对象被更新,它可能不再满足查询条件。
所以我们所说的是缓存查询结果,对吗?
从概念上讲,有许多方法:
最简单的选择是清除整个缓存或在过期时工作。这在大多数情况下都能很好地工作。总是从简单的事情开始,然后去寻找更复杂的解决方案,如果这是真正需要的。
顺便说一句:在弹性搜索中,他们实现了您所描述的功能,这就是所谓的"percolator“。请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html
发布于 2015-07-24 07:24:25
了解缓存数据是否“过时”的唯一方法是再次获取数据,从而否定了首先使用缓存的优点。
另一种方法是使用任意的超时值,然后将本地缓存抛出并替换为新数据,这样实现缓存(或“代理”设计模式)的类将在它注意到缓存数据过期时自动获取新数据。
为了考虑这一选择,您可以努力寻找最优值,这应该是记录将改变的预期时间与不刷新数据的最长时间之间的最佳权衡,最大限度地利用缓存带来的利润。
发布于 2015-07-24 13:31:48
Hibernate二级缓存正是这样做的--保持对象缓存,并在发生更新时使其无效。您还可以另外启用存储对象ids的查询缓存。当然,它要求只有应用程序才有对DB的写访问权。
https://stackoverflow.com/questions/31604273
复制相似问题