检索数据时保证缓存命中

时间:2009-06-03 11:43:30

标签: java sql caching jdbc

问题设置

  1. 实体到达进行处理,并通过一系列步骤对这些实体进行操作,并可能对其他相关实体进行操作并产生一些结果;
  2. 某些实体需要实时处理,无需任何数据库访问;
  3. 目前,该实现只是在数据库中查找实体,而不进行任何缓存。
  4. 优化时间: - )

    可能的方法

    简单缓存

    简单的内存缓存有两个缺陷:

    1. 它可能会溢出,因为我们谈论的是大量实体;
    2. 它不保证在缓存中找到所需的实体,也无法查询可用性或被要求“预加载”自身。
    3. 所以这是不行的。

      实体分析+预加载

      我正在考虑构建某种分析器,以找出需要为给定实体检索哪些数据,即使是大型形式,也请求缓存在带外加载所需的数据。 / p>

      步骤如下:

      1. 实体到来。如果需要在内存中处理,请发送缓存加载请求;
      2. 实体被放置在缓存等待队列中,直到收到缓存加载的响应。如果数据可用,这可能是立即的;
      3. 发送实体进行处理并使用加载的数据;
      4. 缓存已清除。这确实有清算政策的潜力,但我现在并不关心这些政策。
      5. 问题

        您对此方法有何看法?我是否遗漏了一些众所周知的数据访问模式,可以在这种情况下应用?


        更新1 :忘记提及整个处理是单线程的,这确实会大大限制选项。

2 个答案:

答案 0 :(得分:3)

你说:

  

简单的内存缓存有两个缺陷:

     
      
  1. 它可能会溢出,因为我们正在讨论大量实体
  2.   
  3. 它不保证在缓存中找到所需的实体,也无法查询可用性或被要求“预加载”自身。
  4.   

也许我完全误解了你的问题和需求,但这在许多层面听起来都不正确:

  1. 许多缓存解决方案允许您定义可以存储在缓存中的最大元素数。达到最大尺寸后,可以按照先进先出政策或最近最少使用的商品删除商品。
  2. 缓存不应该“保证在缓存中找到所需的实体”;这不是缓存的目的。
  3. 大多数缓存解决方案的API都允许您检查缓存中是否存在密钥(事实上,如果您使用Map构建自己的解决方案,您仍然可以执行此操作...)。< / LI>
  4. Ehcache有self-populating caches,可用于在需要开始检索项目(another link here)之前预先填充缓存。

答案 1 :(得分:2)

基本上你正在尝试缓存数据库查询。当您开始使用缓存时,数据库状态可能已更改。这是数据不一致的一个方法。

作为替代方法,请检查您是否可以优化数据库。在&lt;中有一个数据库回答查询是非常可能的。 10毫秒。您甚至可以拥有索引视图等,并定期访问它,以便将其缓存在内存中。

作为另一种选择,请考虑这一点:通过预取数据,工作总量不会减少。无论是否排队,实体都必须等待预取。既然必须完成工作,您可以在队列工作进程中执行此操作吗?考虑增加工作进程的数量,这样您就可以同时处理更多队列。

编辑:正如您的评论所说,您已经绑定了一个工作线程:

  • 也许分两步拆分处理?第一个进程检索数据库数据,并将丰富的实体存储在新队列中。第二个进程从新队列中读取,并完成涉及其他内存中数据源的工作
  • 使用全局互斥锁保护其他内存中实体。这意味着许多工作线程可以与数据库通信,而只有一个可以访问其他内存中实体。