是否有可能通过设计提供Redis的陈旧数据?

时间:2017-02-27 15:59:20

标签: java caching redis

我有一个Java应用程序,负责为客户端应用程序提供各种(有时是大的)json响应。在应用层,它使用Redis(AWS ElastiCache)根据特定请求缓存具有30秒到5分钟的TTL的json。一些请求是一个相当长时间运行(5-15s),延伸到几个外部服务并返回大量数据。如果TTL是60s,那仍然意味着一些用户每分钟都会得到不可接受的响应时间。我不是在TTL启动时立即从缓存中驱逐数据,而是开始后台任务来获取数据并刷新缓存,同时继续提供数据的陈旧副本(如果存在)。这可以用Redis吗?

1 个答案:

答案 0 :(得分:1)

您可以通过为要缓存的每个项目编写一对条目来手动实现此目的。

  • item:将TTL设置为硬驱逐的实际商品
  • item/fresh:布尔值,其TTL设置为软驱逐(即标记为陈旧)。此TTL应该小于硬TTL。

查询时,总是要求输入两个键

方案1 -缓存未命中(item不存在)

  • 从某处获取物品
  • 用两个键填充缓存
  • 退货

方案2 -缓存命中(两个键都存在)

  • 退货

方案3 -过时(item/fresh不存在)

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