title: 热门列表的实现思路整理
date: 2018-09-09
tags: [工作笔记]


热门的规则

对于热门文章的定义是:

单位时间内,活跃度(”分享“数 + ”点赞“数 + ”评论“数的总和)大于某特定值的文章,被视为热门文章。

热门文章的列表是由后台动态生成的,而且在每次生成的时候,产生的数据不一定是相同的。为了减轻系统的压力和提高api的响应速度,该计算任务使用celery 进行后台任务调度。

后台定时任务循环执行,任务执行时向缓存数据库中插入当前计算出的符合规则的热门文章的索引值,缓存数据库采用的是redis。

定时任务的实现

  • 将新增的热门文章索引写入缓存数据库中,插入的时候,score 值取当前时间戳。
  • 清除一定时间前的热门文章。

新增热门文章

计算热门文章sql 语句实现如下(暂时不考虑分享的数据):

SELECT result.user_publish_id FROM (SELECT a.user_publish_id, COUNT(*) AS count FROM(SELECT p.user_publish_idFROM user_publish AS pJOIN user_like AS lONl.for_obj = p.user_publish_id AND l.like_type = 0 AND l.created_at > '{0}'WHERE p.status = 'VISIBLE'UNION ALLSELECT p.user_publish_idFROM user_publish AS pJOIN user_comments AS cONp.user_publish_id = c.publish_id AND c.status = 'VISIBLE' AND c.created_at > '{0}'WHERE p.status = 'VISIBLE') AS aWHERE a.user_publish_id not in ("{2}")GROUP BY a.user_publish_id
) AS result
WHERE result.count >= {1}

(user_publish 用户发布文章信息表,user_like 用户点赞表,user_comments 用户评论表)
以上sql语句完成了对符合热门条件的文章的筛选,返回的结果集中将不包含应已经在缓存数据库的中索引。

将以上返回的文章索引插入redis:

pipeline.zadd(ALL_HOT_KEYS_CACHE, time.time(), item)

(ALL_HOT_KEYS_CACHE redis 中有序集合的键)

清除一定时间前的热门文章

热门文章进入缓存之后,需要在一定的时间内清除,这是因为被写入redis的之后,score不会被改动。定时任务需要将距离当前较远的缓存数据删除以减轻缓存的压力。

后端的实现

热门类别的分页没有上一页与下一页之说。客户端在请求的时候,有两种参数情况:

  • count:要多少条数据
  • publish_ids:客户端已经缓存的文章id列表

客户端如果仅传入count 参数,后端将返回最新的count条数据信息。
如果传入countpublish_ids,后端返回的count数据中,publish_ids中包含的文章信息将不会被缓存。

这样保证了客户端数据的不重复问题。但是随着客户端浏览的数据越来越多,把么客户端请求的publish_ids列表也越大,后端去重的时候复杂度较高。但是解决这个问题得力于redis的集合操作方法。


# redis_utils.pydef get_redis_sorted_set_diffs(uid, items, count):user_key = USER_HOT_KEYS_CACHE.format(uid)user_hot_key_cache(items, user_key)dest = USER_HOT_KEYS_DESTINATION_CACHE.format(uid)redis_store.zunionstore(dest, {ALL_HOT_KEYS_CACHE: 1, user_key: 0}, 'MIN')x = redis_store.zrevrangebyscore(dest, '+inf', 1)[:count]redis_store.delete(user_key)redis_store.delete(dest)return x

返回的数据排序按照redis返回的集合顺序。

客户端相关的任务

  • 用户首次进入列表界面时,请求不要携带publish_ids
  • 用户下拉刷新的操作同首次进入列表界面的操作。
  • 用户上拉浏览列表的时候,需要携带publish_ids,用于后端管理去重。

存在的问题

  • 客户端访问时需要携带大量的已经缓存的文章id
  • 后端获取数据时的去重,随着publish_ids越来越繁琐。
  • 客户端处理较为繁琐

社区排行榜和热门列表的实现思路对比

相同:

  • 顺序都是动态变化的
  • 都需要额外的资源来保证需求的实现
  • 客户端处理比较繁琐

不同:

  • 社区排行榜是有序的,热门列表是设置门槛的。
  • 社区排行榜是需要记录关注人数的,热门不需要记录活跃度点赞数和评论数均取实时的。
  • 社区有分页参数,热门列表是没有上一页下一页的概念的,仅需要声明count的大小

热门列表的实现思路整理相关推荐

  1. 张铁柱-前端实现《低代码可视化编辑器》(一)思路整理 React-dnd+Ts

    张铁柱-前端实现<低代码可视化编辑器>(一)思路整理 React-dnd+Ts 先上效果: 拖拽生成页面+调整顺序 最近,接到任务做一个低代码编辑器,于是着手整理一下思路,调研一下实现方式 ...

  2. C#FFmpeg视频采集与推送RTMP服务器代码思路整理

    C#视频采集与推送RTMP服务器代码思路整理:在看过FFmpeg后是否认为写C#的视频流采集和推送还是一头雾水啊?深有此感.领导是C#的高手,说可以通过C或C++的代码直接复制粘贴到C#工程然后进行适 ...

  3. 多智能体强化学习思路整理

    多智能体强化学习算法思路整理 目录 摘要 背景和意义 研究背景 强化学习 多智能体强化学习与博弈论基础 研究意义 问题与挑战 问题分类 问题分析 环境的不稳定性与可扩展性的平衡 部分可观测的马尔可夫决 ...

  4. 探索性数据分析的思路整理

    探索性数据分析的思路整理 读取数据 清洗数据,对构建的数据进行整理 探索全局特征, 通过直方图,散点图,聚合函数对数据进行全局的了解 探索数据的分组特征,通过分组操作分析数据集 %matplotlib ...

  5. WAF绕过思路整理(挺全)

    转载至:https://harmoc.com/secnote/waf%E7%BB%95%E8%BF%87%E6%80%9D%E8%B7%AF%E6%95%B4%E7%90%86.html WAF绕过思 ...

  6. 在C#中对列表/数组进行碎片整理——关闭所有空白

    目录 介绍 使用代码 1.列表示例的碎片整理 2.数组示例的碎片整理 更多功能 下载源代码(ZIP)-3.7 KB 下载源代码(7z)-3.2 KB 介绍 1.此方法有助于替换列表的空元素或默认元素. ...

  7. GAN框架研究与思路整理

      本文内容将着重分析当前GAN原理及其应用场景,比对其相对于传统深度学习方法在图像生成等方面的区别 一.原始GAN原理           原始GAN论文中的思想为生成模型与判别模型间的零和博弈,通 ...

  8. VL53L0X 底层思路整理(1)

    传感器资料思路整理 世界上最小的飞行时间测距和姿态探测传感器 特点: •完全集成的微型模块 – 940nm激光VCSEL – VCSEL驱动程序 –带有高级嵌入式测距传感器的微控制器 – 4.4 x ...

  9. 前端实现登录、登出、请求数据的一些思路整理

    前端实现登录.登出.请求数据的一些思路整理(基于React.JWT技术) 登录.登出和数据请求是两种不同的数据交互方式,是互相独立的. 登录.登出基于 JWT(JSON WEB TOKEN) 技术,通 ...

最新文章

  1. java重新组合_Java 合并Word文档
  2. 视频可以转换html,10 个免费的 HTML 视频转换工具
  3. 序列化中的[NonSerialized]字段 -转
  4. PDF转Word技巧,看这篇足够
  5. 有关camshift的知识点
  6. Nginx 教程- 获取真实IP模块 - http_realip_module
  7. Operating System-Thread(5)弹出式线程使单线程代码多线程化会产生那些有关问题
  8. ARM GIC-400 寄存器
  9. 计算机ck,[计算机]ck编程速成.doc
  10. clickhouse Aggregatingmergetree表引擎
  11. iOS--利用Fastlane实现自动化打包
  12. 广数系统u盘支持什么格式_数控车床编程导入u盘 数控车床u盘读不出来
  13. html页面缩小图片缩小,如何缩小html页面中的图片大小?
  14. 计算机怎么远程桌面,电脑怎么打开远程桌面连接功能
  15. ACL2019之对话系统
  16. 使用js实时统计text、textarea等输入框的字数,并进行字数限制
  17. MySQL基础 - 连接查询
  18. word中快速确认字体颜色的方法
  19. 用stream流将list集合根据某个字段分组成Map<String,List<T>>类型的集合
  20. 使用AKO为TKG提供LoadBalancer

热门文章

  1. MongoDB(NoSQL)数据库入门及基本操作
  2. Chinese Postman Problem Aizu - DPL_2_B(无向图中国邮路问题)
  3. 分层领域模型规约与领域模型命名规约
  4. iOS Multiple commands produce
  5. CF7C--Line翻译
  6. Android 获取本地闹钟铃声
  7. Git个人仓库服务器搭建
  8. jdk8 新特性汇总
  9. 汇编标志位及操作讲解
  10. 《Adobe Premiere Pro视频编辑指南(第2版)》——监视和采集方案