【问题标题】:How to evict cache in multiple pods? I have two Openshift pods and I want to send a HTTP request for evict cache in both pods如何驱逐多个 pod 中的缓存?我有两个 Openshift pod,我想在两个 pod 中发送一个驱逐缓存的 HTTP 请求
【发布时间】:2021-03-27 22:10:16
【问题描述】:

我在 Openshift 中有两个微服务 pod,我想清理这两个微服务的缓存。我有一个清除驱逐缓存的端点,请求只进入一个 pod。如何避免重启 pod 以清除缓存?我使用 2.1.10 springboot,每两小时配置一次 cron,但我想清理 HTTP 请求中的缓存。

我在请求中使用来自 org.springframework.cache.annotation 的 @Cacheable 并使用 org.springframework.cache.CacheManager.clear 来驱逐/清理缓存。

【问题讨论】:

    标签: java spring-boot kubernetes openshift spring-cache


    【解决方案1】:

    就像 Spring Framework 中的其他服务一样,缓存服务是一个抽象,而不是一个实现,并且需要使用一个实现来存储缓存数据。这种抽象由 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口实现。

    你还没有说你的 Spring 缓存实现是哪个,所以我想你使用的是默认实现。

    默认情况下,Spring 选择 java.util.concurrent.ConcurrentMap。此实现将您的数​​据存储在内存中,并在您关闭 JVM 时将其消失。对于具有多个 pod 的具体环境,您需要一个集群感知缓存实现。您不能依赖基于内存存储的缓存实现。

    因此,您应该查看 Spring Redis Cache 之类的实现,它是一个集群感知缓存实现,并在所有 pod 中配置它。

    【讨论】:

    • 我想向所有正在运行的 pod 发送一个 HTTP 请求......我如何使用 springboot 做到这一点?
    • 为什么你更喜欢做一个 HTTP 请求而不是选择 Spring Redis Cache 作为缓存实现?抱歉,您真的不想发送 HTTP 请求。只是您认为 HTTP 请求会解决您的问题。首先阅读著名的 XY 问题。 xyproblem.info
    • 您最初的问题中的其他错误:您正在谈论一个 cron 以清理由 CacheManager 管理的缓存。一些缓存实现有一个称为“过期”的概念。 Spring 中的默认实现 ConcurrentMap 不支持它,但其他像 Caffeine (in-memory) 或 Redis Cache (cluster-aware) 确实支持它。所以,如果你现在改变你的实现,你将能够配置过期属性并摆脱你的 cron
    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2021-10-04
    • 2018-05-17
    相关资源
    最近更新 更多