如何使多个并行php请求等待缓存更新?

to94eoyn  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(272)

我有一个标准场景,在这个场景中,有多个并行请求试图访问基于redis的缓存中的同一个密钥。
当此密钥过期时,请求进程通知某个外部工作进程需要重新计算它(该工作进程可能在另一台服务器上)。辅助进程重新计算它并更新缓存。
当缓存是热的时,一切都很好,因为在重新计算新值之前,我可以一直从缓存中提供过时的数据。
问题是当缓存是冷的并且redis中还没有数据可供服务时。请求进程需要等待外部辅助进程生成值。在这种情况下,我不能使用缓存预热,因为只有请求的密钥才应该缓存,因为缓存大小有限。
所以问题是,如何让php请求等待计算出的值在redis中可用?或者在这种情况下,通常的解决方案是什么?
我已经想到的可能的解决方案是:
redis blpop命令可能不起作用,因为重新计算的值不在列表中,感觉有点像解决方法。也许有可能实现某种基于文件的锁?不过,web应用程序和worker位于不同的服务器上,例如,nfs不支持文件锁。
我能想到的唯一可行的工作解决方案是有一个无限while循环,它每x毫秒ping redis一次,并且有一些y max等待时间。然而,这真的是一个好的和实际的解决办法吗?因为我不喜欢在短时间的web请求中使用无限循环。此外,数百个请求可能会运行无限循环,并在重新计算值时等待。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题