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

时间:2010-02-09 15:23:51

标签: php caching

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

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

让我用一个例子来解释一下,我们有一个100个故事的数组并存储在缓存中5分钟。用户投票选出一些故事,以便更改故事的评级。当其他用户进入网站时,他/她将看到缓存的数据,因此将看到旧数据。 (如果选民用户刷新页面,则相同,他也会看到故事的旧投票编号。)

我们无法弄明白,任何帮助都将受到高度赞赏

2 个答案:

答案 0 :(得分:6)

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

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

  2. 另一种低延迟(但成本高)的解决方案是拥有一个pub-sub类型系统,可以动态地向所有其他缓存发布投票。除了高成本之外,您还需要处理各种同步问题。

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

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

  5. AFAIK,reddit不进行实时低延迟投票传播。如果您投票,则不会立即反映在其他客户端上。我的猜测是他们正在进行某种聚合(如#4),但这只是我的推测。

答案 1 :(得分:3)

也许这是您已经考虑过的解决方案,但为什么不只是缓存所有评级?相反,只需更新单个数组,其中i位置包含i首要问题的评分。将其保留在内存中,并将评级清回数据库,因为它可用。

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