我有一个标准场景,您有多个并行请求试图访问基于 Redis 的缓存中的相同键。
当这个密钥过期时,请求进程会通知一些外部工作人员它需要重新计算(工作人员可能在另一台服务器上)。工作人员重新计算它并更新缓存。
当缓存很热时,一切都很好,因为我可以继续从缓存中提供过时的数据,直到重新计算新值。
问题是当缓存很冷并且 Redis 中还没有数据可供服务时。请求进程需要等待,直到外部工作者生成该值。在这种情况下,我不能使用缓存预热,因为由于缓存大小有限,只有请求的键应该被缓存。
所以问题是我怎样才能让 PHP 请求等到 Redis 中的计算值可用?或者在这种情况下,常见的解决方案是什么?
我已经知道的可能的解决方案:
Redis blpop 命令可能不起作用,因为要重新计算的值不在列表中,感觉有点像解决方法。也许可以实现某种基于文件的锁?但是,Web 应用程序和工作程序位于不同的服务器上,例如 NFS 不支持文件锁定。
我能想到的唯一可行的解决方案是有一个无限的 while 循环,每隔 X 毫秒对 Redis 执行一次 ping 操作,并有一些 Y 最大等待时间。然而,这真的是一个好的实用的解决方案吗?因为我不喜欢在所谓的短暂 Web 请求中使用无限循环。此外,在重新计算值时,数百个请求可能会运行无限循环并等待。