gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:25 25 4
gpt4 key购买 nike

在我们的多模块项目中,不同的模块中存在不同的缓存。我们在服务器启动时在 @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com