你登陆了一个充满评论的页面。评论的投票系统将以您的投票结果突出显示。
为支持此要求,数据库架构至少应为:
网页
评论
投票
如果页面ID为123且用户ID为456,则这将是控制器的简单实现:
1)查询用户456对第123页的评论所做的所有投票:
SELECT c.commentId, v.direction
FROM comments AS c, votes AS v
WHERE c.pageId = 123
AND c.commentId = v.commentId
AND v.userId = 456
2)使用此查询的结果构建视图。
支持这种投票系统的数据库查询非常昂贵。评论和投票表将是巨大的。在高流量站点上,成千上万的用户将每秒执行此查询以接收评论投票的个性化视图。你如何扩展这个投票系统,以便数据库不会因过多的请求而过载?你会把它缓存在内存中吗?难道只是将大量观众共同的东西缓存到实践中是不是实际操作?在这种情况下,这些查询特定于单个用户。在拥有数百万用户的网站上,内存很快就会被填满。将发生缓存未命中,数据库将被破坏。
答案 0 :(得分:2)
我认为 Reddit会缓存/存储(针对每个评论)投票的用户列表(以及另一个投票的用户)并且每隔X秒/分钟/小时仅更新此缓存在活动上。该列表将被组织为可以进行二进制搜索。
然后,当生成页面时,服务器只需要检查当前用户ID是否在每个评论的上/下选民的“列表中”。 Reddit还限制了最初可见的注释数量,这将减少所需的测试数量。
Reddit也不会立即更新投票(他们将投票添加到队列中)。他们可以将队列的处理和投票的缓存联系在一起。
我认为reddit还必须基于每个用户跟踪最近的投票,以便他们可以填补上次缓存更新与现在之间的差距。
这可能不是100%准确。
它基于对Reddit架构的有限阅读以及我将要做的事情。