我有一个想法来存储我网站上的帖子的查看次数,但是我遇到了使用哪些方法以及如何设计它的问题。我的用户发布了许多小帖子,因此会有很多独特的帖子
我的要求如下:
帖子存储在Mysql云数据库中。我需要定期从Redis中提取数据来更新Mysql 视图。
我不关心精确度,视图显示可以少一些(比实际可容忍的少10%)。
关于视图的准确性,不必实时。对于较新的帖子,我希望它们每30分钟更新一次 较旧的帖子(超过一周)我可以每天更新一次视图。
理想情况下,每个视图都是唯一的(基于用户),因此每个视图都会计为用户查看过一次的视图。用户无法多次查看帖子。这将是理想的,但我必须存储每个用户在应用程序生命周期中所做的每个视图,并始终检查用户是否已经查看过此帖子,这是不可行的。所以我想要的是视图需要在有限的时间内对用户是唯一的。因此,如果新帖子出来并且Bob查看它将被视为1个视图。如果他在10分钟内再次查看它,则计数仍将如前所述1.如果Bob在1小时内再次查看,则将其视为新视图。如果帖子超过一周,那么鲍勃的观点应该只计算他每天观看多次。
流伪代码:
//Page view comes to server, lets add the unique postId.
//Using SADD because it will not insert a key that already exists. Not sure of the difference between sadd and pfadd?
sadd "post:tracking", @post.id
//Add the unique user who viewed this page
sadd "post:#{@post.id}:uniques", @userId
然后我运行了一个cronjob,它将执行以下操作:
//Run this every 30 minutes
loop through smembers(post:tracking).For each post do{
//Get number of views for this post:
var cnt = SCARD("post:@postId:uniques")
//post to database new count
}
每隔30分钟,它将遍历所有集合(帖子)并获取该集合中成员的基数(计数)并更新Mysql数据库。这里有一个问题,那就是我没有区分新帖子(不超过1周)和旧帖子(超过1周)。在我的示例中,不包括创建帖子的时间,因为我不确定在哪里存储此信息,这正是我正在寻求帮助的地方。我希望提高效率。
答案 0 :(得分:1)
你看过hyperloglogs?了吗?他们非常有效地存储独特的东西(观众),具有非常好的准确性(约1%)。您可以让它们保持运行并每小时/每周/每周从它们中提取统计数据,以获得整体观众数据。