我们有一个像reddit这样的PHP网站,用户可以投票选出故事.
我们试图在网站上使用APC,memcached等,但我们放弃了.问题是我们想要使用缓存机制,但用户可以在网站上随时进行投票,缓存的数据可能会老化并且让其他访问者感到困惑.
让我用一个例子来解释,我们有一个100个故事的数组并存储在缓存中5分钟.用户投票选择了一些故事,以便更改故事的评级.当其他用户进入网站时,他/她将看到缓存的数据,因此将看到旧数据.(如果选民用户刷新页面,则相同,他也会看到故事的旧投票编号.)
我们无法弄明白,任何帮助都将受到高度赞赏
这是在低延迟更新和整体系统/网络负载(又称性能与成本)之间找到平衡的问题.
如果您有足够的备用容量,最简单的解决方案是将您的投票保留在数据库中,并始终在页面加载期间查找它们.当然,这里没有缓存.
另一种低延迟(但成本高)的解决方案是使用pub-sub类型系统,即可在运行中向所有其他缓存发布投票.除了高成本之外,您还需要处理各种同步问题.
下一个选择是拥有共享缓存(例如,memcached,但在不同的机器上共享).对数据库的更新将始终更新缓存.这减少了数据库的负载,并且可以降低延迟响应(因为缓存查找通常比对关系数据库的查询便宜).但是,如果这样做,您将需要仔细调整缓存大小,并具有足够的冗余,以使共享缓存不是单点故障.
另一种更常用的替代方法是进行某种背景投票聚合,其中投票仅作为每个前端服务器上的事务存储,并且您有一个后台进程,连续(例如,每五秒)聚合一次投票并填充所有缓存.
AFAIK,reddit不进行实时低延迟投票传播.如果您投票,则不会立即反映在其他客户端上.我的猜测是他们正在进行某种聚合(如#4),但这只是我的推测.