具有多个客户端并防止缓存踩踏的PHP Web服务的最佳方法

时间:2019-06-21 13:24:55

标签: php caching redis memcached apc

我有一个现有的PHP Web服务,该服务用于执行大约10秒钟的复杂计算。特定的客户端使用模式是多个客户端几乎总是会在10秒的窗口内请求相同的计算。

目前,我们只是允许所有人并行运行。显然,这是昂贵且不必要的,因此希望了解防止这种常规缓存踩踏的最简单方法。

从理论上讲,我们要做的只是简单地让第一个客户端请求去计算结果,然后将计算的结果放入缓存中。如果后续的客户请求到达并正在寻找结果:

a)如果结果已经被缓存-太好了! b)如果结果尚未缓存,但仍在处理中,请等待该结果出现在缓存中,然后再将该值返回给客户端。

我已经准备好几种不同的方法,但是对听到任何实用的建议或建议以帮助决定最简单,最简单的方法很感兴趣。

我们尚未做出缓存决定,因此也可以就使用哪个缓存提出建议。音量低,因此内存可能还不错。是否有任何缓存实现可以真正解决该问题,并阻止在另一个线程实际在填充缓存条目的实际缓存中读取缓存?

缓存正确的事情吗?我们应该使用队列的吗?!

任何基于实践经验的想法或建议,将不胜感激。

1 个答案:

答案 0 :(得分:0)

就您可以实现的解决方案而言,我将使用一个工作线程根据传入的请求队列进行计算。因此,对于第一个请求,工作人员将检查缓存(未命中),计算值,将其存储在缓存中并返回该值。然后,队列中的任何后续请求都将从工作​​线程中获取缓存的值。

现在,如果您不喜欢工作线程和队列,则可以在“检查缓存,进行计算,存储在缓存中”代码块上使用互斥锁来实现相同的目的。

在缓存方面,防止缓存踩踏的解决方案(有时也称为狗爬堆)是使用支持直读缓存的缓存。直读缓存基本上意味着缓存会在未命中的情况下知道从何处获取值。在这种情况下,它将是一个缓存,该缓存支持脚本以计算该值(如果它不在缓存中)。