如何最多每30分钟触发一次缓存失效?

问题描述 投票:0回答:1

我们有一个系统,它接收一堆“项目已更新/删除/...”事件,并负责从各个缓存中擦除该项目。目前,每次“项目已更新/删除/...”事件到达时,该系统都会执行缓存擦除。然而,对项目的更改通常是快速连续进行的,这会导致大量(重复的)缓存失效并在短时间内加载到系统上。

我们希望将缓存擦除延迟 30 分钟,以聚合快速连续的各种更改,并在该窗口结束时仅执行一次缓存擦除。

因此,当第一个“项目 X 已更新/删除/...”到达时,我们希望启动 30 分钟的计时器。该窗口期间与项目 X 相关的任何事件都不会延长启动新窗口的窗口持续时间。 30 分钟结束后,缓存将被擦除。如果在缓存擦除之后事件到达,则会启动一个 30 分钟的新窗口

项目 Y 也可能同时存在类似的、不相关的窗口。我们总共有 500 000 个项目。

是否可以帮助我们提供一些关于如何有效实现这种“聚合”窗口的指示/建议?有没有一种高效的数据结构可以解决我们的问题?

我们考虑过将所有事件添加到数据库中,然后通过 cron 每 30 分钟执行一次分组查询,但这有一些缺点:

  • 所有项目缓存失效都是同时执行的(cron 间隔触发的时间),这会给系统带来很大的负载。因此,这种固定的窗口间隔可能不是一个好的解决方案。因此,我们希望第一个事件触发窗口的启动,而不是固定的 cron。
  • 将所有事件存储在数据库中的开销看起来并不吸引人。
  • 将窗口大小从 30 分钟更改为 30 秒可能会导致对数据库进行大量创建和删除。
  • ...
java algorithm data-structures
1个回答
0
投票

我认为这取决于你的缓存系统。 一般来说,您可以为每个键设置 TTL 并禁用缓存失效。

如果您使用Redis,您可以为您的密钥设置EXPIRE。 https://redis.io/commands/expire/

© www.soinside.com 2019 - 2024. All rights reserved.