我们有一个系统,它接收一堆“项目已更新/删除/...”事件,并负责从各个缓存中擦除该项目。目前,每次“项目已更新/删除/...”事件到达时,该系统都会执行缓存擦除。然而,对项目的更改通常是快速连续进行的,这会导致大量(重复的)缓存失效并在短时间内加载到系统上。
我们希望将缓存擦除延迟 30 分钟,以聚合快速连续的各种更改,并在该窗口结束时仅执行一次缓存擦除。
因此,当第一个“项目 X 已更新/删除/...”到达时,我们希望启动 30 分钟的计时器。该窗口期间与项目 X 相关的任何事件都不会延长启动新窗口的窗口持续时间。 30 分钟结束后,缓存将被擦除。如果在缓存擦除之后事件到达,则会启动一个 30 分钟的新窗口
项目 Y 也可能同时存在类似的、不相关的窗口。我们总共有 500 000 个项目。
是否可以帮助我们提供一些关于如何有效实现这种“聚合”窗口的指示/建议?有没有一种高效的数据结构可以解决我们的问题?
我们考虑过将所有事件添加到数据库中,然后通过 cron 每 30 分钟执行一次分组查询,但这有一些缺点:
我认为这取决于你的缓存系统。 一般来说,您可以为每个键设置 TTL 并禁用缓存失效。
如果您使用Redis,您可以为您的密钥设置EXPIRE。 https://redis.io/commands/expire/