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

标签 php caching

我们有一个类似reddit的PHP网站,用户可以为故事投票。

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

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

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

最佳答案

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

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

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

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

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

据我所知,reddit 不进行实时低延迟投票传播。如果您投票赞成某项内容,它不会立即反射(reflect)在其他客户中。我的猜测是他们正在做某种聚合(如#4),但这只是我的猜测。

关于php - 在类似 reddit 的网站上进行缓存的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2230146/

相关文章:

javascript - 是否可以在 yii 2 的 View 文件中使用 <script src =""> 链接 JavaScript 文件

php - 已删除的 CSS 文件在 joomla 3.2.3 中仍然可用

带有 Redis 缓存的 Django 1.9

java - 为什么 Integer 类缓存值在 -128 到 127 范围内?

java - 缓存实现

kotlin - 如何将@Cacheable 与 Kotlin 挂起功能一起使用

php - SQL SELECT 的问题

php - 在 PHP 中将数组转换为字符串

php - 将提交时的重力表单重定向到刚刚创建的帖子

PHP 从数据库中解码 JSON 字符串返回 NULL