Java:缓存集合

Java:缓存集合,java,algorithm,caching,design-patterns,Java,Algorithm,Caching,Design Patterns,让我们支持用java开发应用程序,并有一个大表。为了提高性能,我们需要缓存数据。这里我们有两种缓存方式: 对象缓存-按id 集合缓存-缓存ID的集合(!) 集合缓存的示例。我们有一个sql查询SELECT*FROM person,其中birhddate=a和age,要知道缓存数据是否“过期”,唯一的方法是再次获取数据,从而否定了首先使用缓存的优势 另一种方法是使用任意超时值,在此值之后本地缓存将被丢弃并替换为新数据,以便实现缓存(或“代理”设计模式)的类在发现缓存数据过时时自动获取新数据 要考虑

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

  • 对象缓存-按id
  • 集合缓存-缓存ID的集合(!)

  • 集合缓存的示例。我们有一个sql查询
    SELECT*FROM person,其中birhddate=a和age,要知道缓存数据是否“过期”,唯一的方法是再次获取数据,从而否定了首先使用缓存的优势

    另一种方法是使用任意超时值,在此值之后本地缓存将被丢弃并替换为新数据,以便实现缓存(或“代理”设计模式)的类在发现缓存数据过时时自动获取新数据


    要考虑这个替代方案,您可以努力寻找最佳值,这应该是在记录更改的预期时间和不刷新数据的最长时间之间的最佳折衷,最大化您从缓存中获得的利益。

    Hibernate二级缓存正是这样做的——保持对象缓存并在更新时使其失效。您还可以另外启用存储对象ID的查询缓存。当然,它要求只有您的应用程序才具有对数据库的写访问权限。

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

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

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

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

    • 更新发生时使整个缓存失效/清除
    • 每当更新表时,使查询结果无效
    • 更新值时:根据新旧对象值计算查询,并更新缓存结果
    • 根本不解决这个问题,而是使用一个在5分钟后使数据过期的方法
    最简单的选项是清除整个缓存或使用到期。这在大多数情况下都很有效。总是从简单的事情开始,如果真的需要的话,再去寻找更复杂的解决方案


    顺便说一句:在弹性搜索中,他们完全实现了您描述的功能,这就是所谓的“percolator”。请参阅:

    @Chris Martin谢谢您抽出时间。我用番石榴。但是,据我所知,它只使用键值缓存。缓存ID可能会导致代价高昂的
    in
    子句。这可以通过使用远程缓存(memcached,redis)来减少,其中multi-get非常有效。数据库级别的物化视图也可以提供显著的加速。让我们假设……有必要解释一下
    表是什么,以及
    大的
    意味着什么(您的问题和标记都没有提到RDB或类似的东西(如果没有R,您确实提到CUD))。