【发布时间】:2020-05-26 22:21:29
【问题描述】:
我有一个 Java 应用程序,负责为客户端应用程序提供各种(有时很大)json 响应。在应用程序层,它使用 Redis (AWS ElastiCache) 缓存 json,其 TTL 取决于特定请求,从 30 秒到 5 分钟不等。一些请求运行时间相当长(5-15 秒),涉及多个外部服务并返回大量数据。如果 TTL 是 60 秒,那仍然意味着某些用户每分钟都得到不可接受的响应时间。我不想在 TTL 启动时立即从缓存中清除数据,而是想启动一个后台任务来获取数据并刷新缓存,同时继续提供数据的陈旧副本(如果存在)。 Redis 可以做到这一点吗?
【问题讨论】:
-
您可以将您的 TTL 设置为长于后台任务间隔吗?那么它只会在出现问题时过期。
-
您是否有理由使用超时,而不是在缓存项目更改时使其失效?
-
@ChrisTanner - 我们无法预测将请求哪些缓存键,因此我们无法运行定期安排的后台任务来保持更新。
-
@TagueGriffith - 我们提供的数据来自许多不同的来源。其中一些我们有能力在它发生变化时得到通知,我们确实设置了一个很长的 TTL 并且只有在我们得到通知时才更新缓存。其他来源更具动态性,我们无法在它发生变化时得到通知,因此我们必须设置一个较低的 TTL(30-60 秒),使其在可接受的范围内以获得良好的用户体验。