2010-02-09 133 views
2

我们有一个像reddit这样的PHP网站,用户可以为故事投票。在类似reddit的网站上做缓存的最佳方式

我们试图使用APC,memcached等网站,但我们放弃了。问题是我们想要使用缓存机制,但用户可以随时在现场进行投票,并且缓存的数据可能比较老,并且令其他访问者感到困惑。

让我用一个例子说明,我们有100个故事组成的数组,并存储在缓存5分钟。,用户投了一些故事,让故事的评级变化。当其他用户进入网站时,他/她会看到缓存的数据,因此会看到旧数据。 (这是相同的,如果选民用户刷新页面,他也看到了故事的老票号。)

我们无法弄清楚,任何帮助将不胜感激

回答

6

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

  1. 如果你有能力的空闲时间,最简单的解决办法是保持在一个数据库中你的票,并始终网页加载过程中找一找。当然,这里没有缓存。

  2. 另一种低延迟(但高成本)的解决方案是有一个发布票在飞行中的所有其它高速缓存发布 - 订阅类型的系统。除了高成本之外,还有各种同步问题需要在这里处理。

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

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

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

3

也许这是一个你已经考虑的解决方案,但为什么不只是缓存一切,但的收视率?相反,只需更新一个数组,其中i th位置包含对i第一个故事的评分。随时保存这些内容,并在收到可用数据后将评分冲回数据库。

如果你只关心前N个故事是最新的,那么i只需要是首页上的故事数量的大小,这可能是一个非常小的数字,如50或所以。

+0

是的,我们肯定是这么想的。其实这是我们迄今为止唯一的解决方案。我打开这个问题,也许对我们的问题有一个更好的解决方案。你能否提出一种保存PHP内存数组的最佳方法,BTW非常感谢你的回应 – alicia 2010-02-09 15:39:41

相关问题