Java 是否可以通过设计从Redis提供过时数据?

Java 是否可以通过设计从Redis提供过时数据?,java,caching,redis,Java,Caching,Redis,我有一个Java应用程序,负责向客户机应用程序提供各种(有时是大型)json响应。在应用层,它使用Redis(AWS ElastiCache)将json与TTL缓存在30秒到5分钟之间,具体取决于特定的请求。有些请求运行时间相当长(5-15秒),涉及到多个外部服务并返回大量数据。如果TTL为60秒,这仍然意味着一些用户每分钟都会收到不可接受的响应时间。我不想在TTL启动时立即从缓存中取出数据,而是想启动一个后台任务来获取数据并刷新缓存,同时继续提供过时的数据副本(如果存在)。Redis是否可以实

我有一个Java应用程序,负责向客户机应用程序提供各种(有时是大型)json响应。在应用层,它使用Redis(AWS ElastiCache)将json与TTL缓存在30秒到5分钟之间,具体取决于特定的请求。有些请求运行时间相当长(5-15秒),涉及到多个外部服务并返回大量数据。如果TTL为60秒,这仍然意味着一些用户每分钟都会收到不可接受的响应时间。我不想在TTL启动时立即从缓存中取出数据,而是想启动一个后台任务来获取数据并刷新缓存,同时继续提供过时的数据副本(如果存在)。Redis是否可以实现这一点?

您可以通过为要缓存的每个项目写入一对条目来手动实现这一点

  • 项目
    :TTL设置为硬逐出的实际项目
  • item/fresh
    :将TTL设置为软逐出(即标记为过时)的布尔值。此TTL应小于硬TTL
查询时,始终要求同时输入两个键

场景1-缓存未命中(
项不存在)

  • 从某处取货
  • 用两个键填充缓存
  • 退货
场景2-缓存命中(两个键都存在)

  • 退货
场景3-过时(
项目/新鲜
不存在)

  • 在后台创建刷新两个键的作业
  • 返回缓存(过时)项

您能否将TTL设置为大于后台任务间隔?只有出现问题时才会过期。是否有理由使用超时,而不是在缓存项发生更改时使其无效?@ChrisTanner-我们无法预测将请求哪些缓存键,因此,我们不能定期运行安排的后台任务来保持更新。@TagueGriffith-我们提供的数据来自许多不同的来源。其中一些我们有能力在它发生变化时得到通知,并且我们确实设置了一个很长的TTL,并且只有在得到通知时才更新缓存。其他来源更具动态性,我们无法在其发生变化时获得通知,因此我们必须设置一个较低的TTL(30-60秒),该TTL在良好用户体验的可接受范围内。