首页 > 解决方案 > 更新表时触发 Guava 缓存刷新

问题描述

目前正在从 db usingClientDAO.getClients()和缓存 using中获取客户端列表,guava刷新时间为 30 分钟,如下所示

private List<String> getClients() {
        final Supplier<List<String>> supplier = () ->  ClientDAO.getClients();
        Suppliers.memoizeWithExpiration(supplier, 30, TimeUnit.MINUTES);
        return supplier.get();
    }

我们有不同的应用程序更新client表和另一个从client表中读取并缓存的应用程序,如上所述,Restful这两个应用程序之间没有或任何类型的 api 通信。每当更新数据库中的相应client表而不是在特定时间窗口 30 分钟刷新时,有什么方法可以触发此缓存更新?

标签: javacachingguava

解决方案


所以从这个问题我会假设:

  • 有两个应用程序AB
  • 有一个客户表 - 我们称之为table X
  • A读取和缓存数据table X
  • B将数据写入table X

A需要知道何时B写入table X,以便A可以更新它的缓存数据。

选项1

如果您控制Aand B,您可以扩展行为 - 当B写入数据库并且写入成功时,B会触发一个事件A(例如调用 REST 端点)并A知道更新其缓存。

选项 2

如果你不能控制B,但你可以控制ADB你可以使用DB作为集成点——这是遗留应用程序的常用方法——这DB是应用程序唯一可以集成的地方。

因此,您可以再次将B触发事件的相同概念应用于A,但这次事件(由触发器启动)存储在 中的表中,DB并且 REST 调用是使用内部过程从数据库本身进行的。

一个直接的方法是:

  • B将数据写入table X
  • 有一个insert triggerfor table X,它在事件存储表中执行一条 INSERT 语句(我们称之为UPDATE_CACHE_EVENT

您的“update_cache_event”现在被触发(例如保存在该表中),从这一点开始您有更多选择:

  • A可以每秒监视此表并在写入新事件时触发它的缓存更新

  • A公开 REST API,它是从调用的DB- 例如在 SQL 服务器中编写一个过程,该过程监视UPDATE_CACHE_EVENT表并调用A的 REST API。

一些想法:

  • 不要使用触发器本身来调用外部 API,为此使用专用过程
  • 触发器具有性能损失(例如,每次写入table X都会调用对事件表的另一个插入),因此在设计解决方案时应该考虑这一点。

推荐阅读