我们有一个类似reddit的PHP网站,用户可以为故事投票。
我们尝试在网站上使用 APC、memcached 等,但我们放弃了。问题是我们想要使用缓存机制,但用户可以在网站上随时投票,并且缓存的数据可能是旧的,并且会让其他访问者感到困惑。
让我用一个例子来解释,我们有一个包含 100 个故事的数组,并在缓存中存储了 5 分钟。用户对某些故事进行了投票,因此故事的评级发生了变化。当其他用户进入网站时,他/她将看到缓存的数据,即旧数据。 (如果投票者用户刷新页面,这也是一样的,他也会看到故事的旧投票数。)
我们无法弄清楚,任何帮助将不胜感激
最佳答案
这是在低延迟更新和整体系统/网络负载(又称性能与成本)之间找到平衡的问题。
如果您有空闲容量,最简单的解决方案是将您的投票保存在数据库中,并始终在页面加载期间查找它们。当然,这里没有缓存。
另一个低延迟(但高成本)的解决方案是拥有一个发布-订阅类型的系统,可以动态地将投票发布到所有其他缓存。除了高成本之外,您还需要处理各种同步问题。
下一个替代方案是使用共享缓存(例如,memcached,但在不同机器之间共享)。对数据库的更新将始终更新缓存。这减少了数据库的负载,并降低了延迟响应(因为缓存查找通常比关系数据库的查询便宜)。但如果您这样做,则需要仔细调整缓存大小,并有足够的冗余,以使共享缓存不会出现单点故障。
另一种更常用的替代方法是进行某种后台投票聚合,其中投票仅作为事务存储在每个前端服务器上,并且您有一个连续的后台进程(例如,每五秒)聚合投票并填充所有缓存。
据我所知,reddit 不进行实时低延迟投票传播。如果您投票赞成某项内容,它不会立即反射(reflect)在其他客户中。我的猜测是他们正在做某种聚合(如#4),但这只是我的猜测。
关于php - 在类似 reddit 的网站上进行缓存的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230146/