Php 在类似reddit的网站上进行缓存的最佳方法

Php 在类似reddit的网站上进行缓存的最佳方法,php,caching,Php,Caching,我们有一个像reddit这样的PHP网站,用户可以投票支持这些故事 我们尝试使用APC、memcached等来创建网站,但我们放弃了。问题是我们想使用缓存机制,但用户可以在站点上随时投票,缓存的数据可能会很旧,让其他访问者感到困惑 让我用一个例子来解释,我们有一个包含100个故事的数组,并在缓存中存储了5分钟。一个用户投票选择了一些故事,因此这些故事的评级发生了变化。当其他用户进入网站时,他/她将看到缓存的数据,因此是旧数据。(如果投票者用户刷新页面,他也会看到故事的旧投票号码。) 我们无法理解

我们有一个像reddit这样的PHP网站,用户可以投票支持这些故事

我们尝试使用APC、memcached等来创建网站,但我们放弃了。问题是我们想使用缓存机制,但用户可以在站点上随时投票,缓存的数据可能会很旧,让其他访问者感到困惑

让我用一个例子来解释,我们有一个包含100个故事的数组,并在缓存中存储了5分钟。一个用户投票选择了一些故事,因此这些故事的评级发生了变化。当其他用户进入网站时,他/她将看到缓存的数据,因此是旧数据。(如果投票者用户刷新页面,他也会看到故事的旧投票号码。)


我们无法理解,我们将非常感谢您提供的任何帮助

也许这是您已经考虑过的解决方案,但为什么不缓存所有内容,而是缓存评级呢?相反,只需更新单个数组,其中
i
th位置包含
i
th顶部故事的评级。始终将其保存在内存中,并在数据库可用时将评级刷新回数据库


如果您只关心前N个故事是最新的,那么
i
只需要是头版故事数量的大小,这大概是一个非常小的数字,比如50个左右。

这是一个在低延迟更新和总体系统/网络负载(也称为性能与成本)之间找到平衡的问题

  • 如果您有多余的容量,最简单的解决方案是将您的投票保存在数据库中,并在页面加载期间始终查找它们。当然,这里没有缓存

  • 另一个低延迟(但高成本)解决方案是拥有一个pub子类型系统,该系统可以动态地将选票发布到所有其他缓存。除了高昂的成本外,这里还需要处理各种同步问题

  • 下一种选择是使用共享缓存(例如memcached,但在不同的机器上共享)。对数据库的更新将始终更新缓存。这会减少数据库的负载,并降低响应延迟(因为缓存查找通常比查询关系数据库便宜)。但如果这样做,则需要仔细调整缓存的大小,并具有足够的冗余,以使共享缓存不会出现单点故障

  • 另一种更常用的替代方法是使用某种后台投票聚合,其中投票仅作为事务存储在每个前端服务器上,并且您有一个后台进程,该进程连续(例如,每五秒钟)聚合投票并填充所有缓存


  • 好吧,reddit不会进行实时低延迟投票传播。如果你投票支持某件事,它不会立即反映在其他客户身上。我的猜测是他们在做某种聚合(如#4),但这只是我的猜测。

    是的,我们确实考虑过这一点。事实上,这是我们目前得到的唯一解决方案。我提出了这个问题,也许有更好的办法解决我们的问题。你能推荐一种最好的方法来为PHP保存一个数组吗?顺便说一句,非常感谢你的回复