糗事百科解决翻页内容重复的思路是什么
很多内容更新比较快的网站,在翻页的时候由于已经有了新的内容或者排序发生了变化会导致内容重复,比如我现在看的第一页有个id是10000的帖子,在翻页后还能看到这个id为10000的帖子。
我在观察糗事百科的时候发现他们网站没有这个问题。
糗事百科的翻页链接里面会有一个s的参数,比如http://www.qiushibaike.com/8hr/page/2?s=4625315 这个s的数值貌似是版本号。不过没能想通这个逻辑是怎么处理的。哪位大牛能分析下?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果你要认真看,你会发现没你说得那么厉害,看8小时内容的时候还是会出现重复的内容(两三个月前吧,因为最近没看了,所以不确定现在他们是否修正了这个问题)。
如果你想要实现,我给你提供一种山寨方式吧。。。我以最近8小时内容来举例(这是有原因的哈。。)
(1)因为是高并发的应用,所以在服务器后台程序每隔一段时间就产生一个当前8小时内容的排序帖子ID(因为在8小时限制范围内,对应的帖子ID不会很多,如果是对全数据库这么操作,你的服务器我想还没那么NB,那就考虑其他方法吧,办法都是人想出来的),保存数据时在redis中以列表的方式存在,key是排序时的时间戳(转换为字符串),value就是排序ID的集合,当取内容的时候就从该队列中取出对应页数的ID,然后再根据ID去取内容,我想他的帖子内容和评论是分开的,至少帖子内容是缓存起来了的。
(2)当新用户接入的时候就给他分配一个标识符,比如他的 S 参数(我估计最开始他们想用session来识别,但是如果不登录的话也没必要,所以就让你请求的时候加一个 S 参数)。
(3)根据用户的对首页的请求时间,计算服务器中最接近的一个时间戳,然后在redis中建立一个用户标签(s参数)到(1)中key的对应关系,然后下次他请求其他页数的时候就不会出现你说的那些问题了。。。接下来你懂的
(4)一定要考虑好(1)(2)中key的过期时间,如果超过一定时间就让它失效,如果用户还根据这个s参数来访问或者是服务器中没有找到用户请求时传递的S参数,说明他离开太久了,那就重定向到最新时间戳吧,然后重复(2)。
(5)其实刚刚我想的是当有用户接入的时候就产生一个信息队列,但是这种情况太浪费了,用上面的情况还是能够满足的。当然你随意哈。。。其实建议运营人员根据每天时段的不同,服务器压力不同,来动态调整产生排序帖子ID的间隔时间。
我的分析结果是这样的:
假设糗事百科帖子中有个score字段来表示帖子的热度得分,得分越好,越应该排在前面。
可以用redis的sorted set来保存排序,把帖子id和score存进去。这样翻页的时候就可以先计算出来第N页是哪些id,然后selct articles where id in (a,b,c,d...).
而且这个sorted set可以利用定时任务来创建新版本。访问首页的时候按照最近版本来查找。有s这个参数的时候,就去找s的值所对应的sorted set版本。
每个sorted set有个自动过期时间,可以自动清除数据,防止redis中数据过多。
如果传递的s版本过低,没有所对应的sorted set版本的时候就显示现在的最近版本。
不知道这样是否可行