更新表时触发Guava缓存刷新

时间:2019-06-05 19:05:14

标签: java caching guava

目前正在使用ClientDAO.getClients()从数据库中获取客户端列表,并使用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通信2个应用程序。每当数据库中相应的client表被更新而不是在30分钟的特定时间窗口刷新时,是否有任何方法可以触发此缓存更新?

1 个答案:

答案 0 :(得分:0)

因此,从这个问题出发,我将假设:

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

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

选项1

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

选项2

如果您无法控制B,但是可以控制ADB,则可以使用DB作为集成点-这是一种常见的处理方法旧版应用程序-DB是唯一可以集成应用程序的地方。

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

直接的方法是:

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

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

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

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

一些想法:

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