【问题标题】:Cache update with db changes使用数据库更改进行缓存更新
【发布时间】:2012-12-31 20:37:00
【问题描述】:

我们有一个基于 java 的产品,它将 Calculation 对象作为 blob 保存在数据库中。在运行时,我们将其保存在内存中以获得快速性能。现在有另一个进程定期更新数据库中的这个 Calculation 对象。现在,最好的实现策略是什么,以便当这个对象在数据库中更新时,缓存会删除存储的对象并再次从数据库中获取它。

除非必须使用,否则我不会更喜欢任何缓存框架。

感谢您对此的回应。

【问题讨论】:

  • 您的数据库支持触发器吗?
  • 你使用什么缓存?
  • 我们正在使用 mysql 数据库,但正在考虑迁移到 mssql。你能告诉我如何使用触发器更新内存对象吗?
  • 我们不使用任何缓存产品,使用普通的hashmap来缓存对象。
  • 您可以在programmers.stackexchange.com 上获得更好的答案,因为这显然是与软件架构和设计模式相关的问题。

标签: java mysql performance caching triggers


【解决方案1】:

如果不了解您的系统架构、设计约束、IT 策略等,很难为您的问题提供好的答案。

我个人会使用 消息模式 来解决这个问题。该模式的一些优点如下:

  • 您的系统组件(计算过程、更新过程)可以松散耦合
  • 根据消息传递模式的实现,您可以“连接”许多计算过程(扩展)和许多更新过程(使用主从方法)。

但是,实现消息传递模式可能是一项非常具有挑战性的任务,我建议采用现有框架或产品之一。

我希望这至少会有所帮助。

【讨论】:

    【解决方案2】:

    我之前做过一些与你的场景类似的工作,一般有两种方法。 一,缓存持有者定期轮询数据库,获取它需要的数据并将其保存在内存中。数据可以存储在 HashMap 或其他一些集合中。这种方法简单易实现,不需要额外的框架或库。但是用户将不得不时不时地忍受脏数据。此外,如果轮询器数量巨大或查询速度不够快,轮询会对 DB 造成很大压力。不过,如果你对实时性的要求不高,而且你的系统规模比较小,一般也不错。

    另一种做法是缓存持有者订阅数据更新者的通知,并在收到通知后更新其数据。它提供了更好的用户体验,但这会给您的系统带来更多的复杂性,因为您必须涉及一些 MS 基础架构,例如 JMS。开发和调优更耗时。

    【讨论】:

      【解决方案3】:

      我知道我很晚才回应这个问题,但它可能会帮助寻找相同问题的人。 这是我的问题,我将 requestPerMinute 信息存储在 Java 过滤器中的 Hashmap 中,该过滤器在应用程序启动期间被加载。如果有人用新信息更新数据库,地图不知道这一点。 解决方案:我在我的 Java 过滤器中使用了一个变量 updateTime ,它只存储了我的哈希图上次更新的时间,并且每次请求它都会检查当前时间是否超过 24 小时,如果是,那么它会从数据库中更新哈希图。所以每 24 小时它只是刷新整个哈希图。 虽然我的用例不是实时更新,所以它适合用例。

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多