如何处理内容排名系统?

时间:2019-07-13 15:48:03

标签: database rest websocket

我知道这个问题的措词很差,所以我举一个例子。

比方说,我们有一个存储数百个文件的文件系统,以及一个包含这些文件路径的数据库。 数据库中文件的每个存储路径均按“喜欢”排序。文件的喜欢次数可以上升和下降,而且这种上升非常频繁。

现在我有一个客户想要在首页上获取前10个降序文件,然后在下一页 第二页上排名10的文件,依此类推。

如果我们想在客户端上实时显示文件,我将如何处理这些文件的排名频繁变化。

每次都对数据库进行请求,获取所有文件,然后按其排序,这感觉有点不对劲,因为数据库可能会变得很大。

我还考虑过在服务器上只有一个内存中的高速缓存,该高速缓存可能存储前X个排名文件甚至所有文件。会更好吗? 也许那时我可以使用套接字,并且对于文件的喜欢中的每一次更改,我都可以仅将其告知客户端?

我真的不知道如何解决这个问题,甚至不知道做这些事情的正确方法是什么。

任何帮助将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这里最简单的解决方案是实现专用计数器表。该表将如下所示。

CREATE TABLE counter_table (
  file_path int(10) unsigned NOT NULL,
  like_count int(10) signed DEFAULT '0',
  PRIMARY KEY (file_path)
) ENGINE=InnoDB)

请注意,我已将ENGINE指定为InnoDB,这与MyISAM不同,后者作为表级锁定,InnoDB实现了行级锁定。这意味着与MyISAM不同,并发查询更新同一表中的不同行不会互相阻塞。

现在,您可以使用这样的查询更新每个文件的值。

UPDATE counter_table SET like_count = like_count+1 where file_path="XYZ";

此解决方案应为中等至高流量提供服务。当您开始接近高流量时,您可能需要评估更多基于流聚合的解决方案,例如Apache Spark Streaming