我知道这个问题用词很糟糕,所以我举个例子。
假设我们有一个存储数百个文件的文件系统,以及一个包含这些文件路径的数据库。数据库中文件的每个存储路径由多个点赞进行排名。一个文件的点赞数量可以起伏不定,而且经常出现这种情况。
现在我有一个客户端,他希望在第一页上获得前10个降序排列的文件,然后在第二页上获得下10个排列的文件,依此类推。
如果我们想要在客户端实时显示这些文件,我该如何处理这些文件排名的频繁更改。
每次向数据库发出请求,获取所有文件,然后按likes对其进行排序,感觉有点不对劲,因为数据库可能会变得非常大。
我还考虑在服务器上建立一个内存缓存,用来存储前X个排序的文件,甚至是所有文件。这样会更好吗?也许我可以使用套接字,并且对于文件之类的任何更改,我可以只通知客户端?
我真的不知道如何处理这个问题,甚至不知道做这些事情的正确方法是什么。
任何帮助都将不胜感激。谢谢!
发布于 2019-07-14 15:20:31
我认为这里最简单的解决方案是实现一个专用的计数器表。表格将如下所示。
CREATE TABLE counter_table (
file_path int(10) unsigned NOT NULL,
like_count int(10) signed DEFAULT '0',
PRIMARY KEY (file_path)
) ENGINE=InnoDB)请注意,我已经将引擎指定为InnoDB,这与MyISAM不同,后者作为表级锁定,InnoDB实现行级锁定。这意味着与MyISAM不同,更新同一个表中的不同行的并发查询不会相互阻塞。
现在,您只需使用如下查询来更新每个文件的值。
UPDATE counter_table SET like_count = like_count+1 where file_path="XYZ";此解决方案应服务于中等到高流量。当您开始接近非常高的流量时,您可能需要评估更多基于流聚合的解决方案,如Apache Spark Streaming。
https://stackoverflow.com/questions/57020640
复制相似问题