java - 更新表时触发 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 分钟刷新时,有什么方法可以触发此缓存更新?
解决方案
所以从这个问题我会假设:
- 有两个应用程序
A
和B
- 有一个客户表 - 我们称之为
table X
A
读取和缓存数据table X
B
将数据写入table X
A
需要知道何时B
写入table X
,以便A
可以更新它的缓存数据。
选项1
如果您控制A
and B
,您可以扩展行为 - 当B
写入数据库并且写入成功时,B
会触发一个事件A
(例如调用 REST 端点)并A
知道更新其缓存。
选项 2
如果你不能控制B
,但你可以控制A
,DB
你可以使用DB
作为集成点——这是遗留应用程序的常用方法——这DB
是应用程序唯一可以集成的地方。
因此,您可以再次将B
触发事件的相同概念应用于A
,但这次事件(由触发器启动)存储在 中的表中,DB
并且 REST 调用是使用内部过程从数据库本身进行的。
一个直接的方法是:
B
将数据写入table X
- 有一个
insert trigger
fortable X
,它在事件存储表中执行一条 INSERT 语句(我们称之为UPDATE_CACHE_EVENT
)
您的“update_cache_event”现在被触发(例如保存在该表中),从这一点开始您有更多选择:
A
可以每秒监视此表并在写入新事件时触发它的缓存更新A
公开 REST API,它是从调用的DB
- 例如在 SQL 服务器中编写一个过程,该过程监视UPDATE_CACHE_EVENT
表并调用A
的 REST API。
一些想法:
- 不要使用触发器本身来调用外部 API,为此使用专用过程
- 触发器具有性能损失(例如,每次写入
table X
都会调用对事件表的另一个插入),因此在设计解决方案时应该考虑这一点。
推荐阅读
- pandas - 连接两个数据帧,其中一个数据帧是另一个数据帧的子集
- json - 如何使用 VUE 从 API 显示 JSON 数据
- python - 与列表相比,字符串的“in”运算符的时间复杂度是否存在差异?
- windows - 如何在windows中新建命令“使用chrome打开网址搜索单词方便在线学习英语”
- python - 来自 id() 函数调用的指针?
- python - 带有张量流 2.0 的 tflearn
- loops - 关于在应用程序脚本中循环的非常简单的问题
- javascript - 防止传单弹出窗口中的图像缓存?
- python - 使用 Python 3 翻转数字
- android - 在android文本视图中显示带有内联样式属性的html字符串