使用db更改缓存更新

时间:2013-01-17 10:20:50

标签: java mysql performance caching triggers

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

我不喜欢任何缓存框架,直到必须使用它。

我很感激对此的回应。

3 个答案:

答案 0 :(得分:2)

在不了解您的系统架构,设计限制,IT战略等的情况下,很难为您的问题提供良好的答案。

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

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

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

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

答案 1 :(得分:0)

我之前做过类似你的情景的工作,通常有2种方法。 一,缓存持有者定期轮询数据库,获取所需数据并将其保存在内存中。数据可以存储在HashMap或其他一些集合中。这种方法简单易行,无需额外的框架或库。但用户必须不时忍受脏数据。此外,如果轮询器数量巨大或查询速度不够快,轮询将对DB造成很大压力。但是,如果您对实时性的要求不高并且系统规模相对较小,则通常情况并不差。

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

答案 2 :(得分:0)

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