java - Spring应用程序启动时如何使缓存依赖于其他缓存

标签 java spring caching ehcache caffeine

在我们的多模块项目中,不同的模块中存在不同的缓存。我们在服务器启动时在 @PostConstruct 中填充所有这些缓存。 现在,某些缓存依赖于可能存在于不同模块中的其他缓存。因此,它要求在依赖于该缓存的缓存之前填充一些缓存。 1.我们如何在Spring中做到这一点?我可以利用任何设计模式吗? 2. 如果缓存更新了,我们如何将更新的更改传播到那些依赖于实时更新的缓存的缓存?

module 1---
    Cachce1

module 2--
    Cache2

module 3--
    Cache3

class Cache1 {
  private ConcurrentMap<> cache; 
  @PostConstruct() {
    cache = filleCache();
  }
}
class Cache2 {
  @Autowired
  private Cache1 cache1;
  private ConcurrentMap<> cache; 
  @PostConstruct() {
    cache = cache1;
  }
}
class Cache3 {
  @Autowired
  private Cache2 cache2;
  private ConcurrentMap<> cache; 
  @PostConstruct() {
    cache = cache2;
  }
}

最佳答案

依赖项:初始化顺序通常由 DI 框架正确完成。因此,Cache2 post 构造是在 Cache1 完全初始化后运行的。如果您仅在 CuncurrentMap 中缓存完整的数据集,则可以改用记忆化,请参阅 https://dzone.com/articles/need-micro-caching-memoization

避免缓存堆栈。有时避免在中间层进行缓存更简单。一种简单的方法是缓存数据进入的位置,例如持久层,然后缓存数据出去的地方,例如响应片段或完整响应。由于无论如何,完整的数据都缓存在最顶层的缓存中,因此中间缓存也可能得不到任何命中。

这在很大程度上取决于数据的类型及其在下一层的使用频率。

how we can propagate this updated change?

您有多种选择。如果 module1 知道其依赖关系,您可以调用 module2 和 3 的重新加载。如果 module1 代码不应依赖于其客户端,则使用事件监听器模式。根据数据的来源,已经存在现有的机制。查找 Spring Data 事件、数据库的更改数据捕获功能、数据库或持久层的触发器。

您可以通过使用缓存条目的过期时间来使事情变得简单,并在一段时间后简单地更新/重新加载数据。然而,过期和缓存堆叠本身就是一个问题。如果您使用 5 分钟的固定到期时间,则有效到期时间将每一层相加。因此,对于三层,数据可能会在 5 或 15 分钟后刷新。为了避免这种情况,我们通过缓存层传播一个到期时间点以及数据。

关于java - Spring应用程序启动时如何使缓存依赖于其他缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648994/

相关文章:

java - 包含另一个类的实体持久保存到 MySQL 中

oracle - SQL 支持缓存并回退到数据库

android - 如何使用 Volley 从缓存中删除图像?

ruby-on-rails - 部署时 "Warm Up Cache"

java - 处理:未使用的代码错误

java - 即时加负值

java - 在保留之前自动大写字符串

使用 JBoss/Spring 和 NetBeans 部署 WebAppp 时出现 javax.naming.NameNotFoundException

java - 使用 AbstractRoutingDataSource 动态更改数据库架构/目录

javascript - 如何在刷新jsp页面单击单选按钮后保持单选按钮处于选中状态