假设可以使用 MySQLredis本地缓存以及MQ

用户量级千万,新闻数据百万用户数比新闻数还多。用户的操作包括:

  • 关注某个新闻
  • 获取某个新闻的关注数量
  • 获取 top10 热点新闻
  • 查询自己关注的新闻。

可以推测,获取 top10 热点新闻请求会远大于关注某个新闻的请求。这些请求都不能直接压入数据库,数据库受不了。

首先想到的是 Redis 中的 Zset,所有的新闻id作为key放入同一个zset中,用户关注某个新闻,使用 zincrby 给这个新闻分数 +1。读取 top 10的时候,用zrevrange.

并且,在实际业务上(例如微博热点话题,知乎热点话题,都是每过一段时间才更新的),top10 热点新闻并不是实时更新的,可以接受一点延迟,可以通过客户端实例的本地缓存,将读取到的 top 10 存在本地缓存一段时间,过了这段时间自动失效。

但是这样也会很快遇到性能瓶颈

1.zset 在很大时可能不满足我们对于性能的要求
Redis 的 Zset 在数量够大的时候底层基于 skiplist:

skiplist 实现简单,插入、删除、查找的复杂度均为O(logN)。zincrby 实际上是一个查找+删除+插入(当然由于score只加了1,所以删除插入只修改相邻节点,这个有优化)

我们的场景是首先插入的新闻分数都是0,之后增长这个分数,在新闻很多,并且并不能确定某些新闻是热点的时候,zincrby 导致的节点变动很频繁。这个通过业务设计可以优化,例如新闻分级,不同级别的新闻初始分数不同

2.放入同一个 zset,对于单实例 redis 性能瓶颈时,扩展不友好

用户千万量级,更新很频繁,如果都更新同一个 zset,很快会遇到性能瓶颈。读取还好说,可以通过本地缓存,因为展示最热点的top10的实时性要求并没有那么高。这时考虑 redis 集群,redis分片,但是如果放在同一个 zset,无法分摊压力。

那么我们可以换一种思路:redis 中,每个新闻id作为key,关注数作为value,存储简单的键值对。用户关注了某个新闻:

同步事务更新数据库中的用户关注新闻表,这个每个用户会均摊行锁压力
缓存新闻id key + 1(注意catch住缓存不可用的异常)
写入 MQ,之后返回
MQ 消费更新数据库这个新闻的关注数量,这样不会有性能瓶颈,同时针对新闻id做queue以及线程分区(就是同一个新闻总是对应特定的queue以及线程,尽量每一个行锁一个线程更新,避免数据库 lock wait timeout)

怎样获取 top 10:定时任务扫描数据库,按照新闻关注数量排序获取top10,直接放入缓存。用户请求都是读取这个缓存。虽然实时性差,但是能满足需求。

读取某个新闻的关注数量:这个就读缓存,缓存不可用,读取数据库。

获取某个用户关注的新闻列表:这个读取数据库,如果感觉也有性能瓶颈,对于每个用户id添加缓存保存关注的新闻列表即可。这个很简单

每日一面 - Redis程序设计中,上百万的新闻,如何实时展示最热点的top10条呢相关推荐

  1. redis存储新闻列表_每日一面 - Redis程序设计中,上百万的新闻,如何实时展示最热点的top10条呢...

    假设可以使用 MySQL,redis,本地缓存以及MQ. 用户量级千万,新闻数据百万,用户数比新闻数还多.用户的操作包括:关注某个新闻 获取某个新闻的关注数量 获取 top10 热点新闻 查询自己关注 ...

  2. 【PBL项目实战】户外智慧农场项目实战系列之4——Mind+Mixly双平台ESP32数据上云及云端可视化实时展示

    [PBL项目实战]户外智慧农场项目实战系列之4--Mind+Mixly双平台ESP32数据上云及云端可视化实时展示 原文链接  https://mp.weixin.qq.com/s/r_NeJdPoi ...

  3. 微型计算机中既能作为输出设备,在微机的硬件设备中,有一种设备在程序设计中既可以当做输出设备,又可以当做输入设备,这种设备是ß...

    在微机的硬件设备中,有一种设备在程序设计中既可以当做输出设备,又可以当做输入设备,这种设备是ß 更多相关问题 搜寻;寻找;检索 中财I-作业2-ACA-17级.docx 从眨眼时间来看,如果少于1秒钟 ...

  4. Django世界-迈出第十步-Redis前言(上)

    Dajngo学习 Redis 一. NOSQL 1. 如今网络流程 2. 为什么用 NOSQL 3.NoSQL代表 4.关系型数据库与NoSQL的区别? 1). RDBMS: 2). NoSQL 5. ...

  5. Redis 敢在线上做Keys正则匹配操作!你可以离职了!

    作者:孤独烟,资深后端工程师,业内知名原创作者 一个新闻 新闻内容如下 php工程师执行redis keys * 导致数据库宕机 某公司技术部发生2起本年度PO级特大事故,造成公司资金损失400万,原 ...

  6. redis在Linux上的安装

    1.redis在Linux上的安装 1)安装redis编译的c环境,yum install gcc-c++ 2)将redis-2.6.16.tar.gz上传到Linux系统中 3)解压到/usr/lo ...

  7. 尽快安装修补程序!微软 Word 漏洞影响上百万人

    微软在美国时间周二时发布针对 Word 的安全更新修补档案,希望能制止影响上百万用户的零时差攻击漏洞. 根据资安公司 Proofpoint 的调查,恶意程序命名为 Dridex,攻击者可以透过这项漏洞 ...

  8. 浅谈单片机程序设计中的“分层思想”!

    浅谈单片机程序设计中的"分层思想",并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种 ...

  9. 在ASP程序设计中在使用Response对象

    Response对象在ASP程序设计中的主要功能是从浏览器端到服务器端传送数据到浏览器的客户端,我们知道ASP的脚本是在服务器端执行的,他并没有输出"值"的功能.要想拥有输出&qu ...

最新文章

  1. 【深度学习】LSTM神经网络解决COVID-19预测问题(二)
  2. 编程小白的第一本python入门书-《编程小白的第一本Python入门书》读书笔记
  3. 完美的代价 c语言,蓝桥杯基础练习 完美的代价
  4. 中文论文黑白矢量图绘制
  5. 关于static变量的定义及性质的深层介绍
  6. 并行、并发,两者的区别
  7. “约见”面试官系列之常见面试题第十一篇之canvas(建议收藏)
  8. 虚拟化关键技术及解决方案
  9. GridView控件中的一些常见问题
  10. 如何去选取第一批要阅读的论文?_顶会最佳论文奖得主:初入科研领域,如何正确做科研?...
  11. 《高性能科学与工程计算》—— 导读
  12. 牛客小白月赛8: E. 诡异数字(数位DP)
  13. Spine 3.8.75 导入Unity报错
  14. 【雨滴桌面】简洁桌面天气皮肤YcWea5.5,直接通过HTML文档获取天气数据,鼠标移入显示近三天天气,鼠标移出隐藏
  15. git创建本地ssh密匙
  16. 大数据分析与应用技术创新平台
  17. sof_pof_jic_elf程序下载方法
  18. Wi-Fi 探针 - 智能探针 - 探针盒子 -> 危害用户信息安全
  19. Web代理(HTTP代理)
  20. HINet | 性能炸裂,旷视科技提出适用于low-level问题的Half Instance Normalization

热门文章

  1. .NET Core 3.0和IIS:HTTP错误500.30-ANCM进程内启动失败:无法加载coreclr
  2. 最全的正则表达式教程
  3. 2020年T电梯修理考试总结及T电梯修理模拟试题
  4. CSS3之解决相邻border重合加粗问题
  5. 思杰马克丁与Alien Skin合作发布Exposure X4 中文版
  6. GitHub 发来了包裹!开箱!
  7. 通过C语言“求俩个数的二进制不同位的个数”
  8. 帧中继点到多点子接口
  9. WPF 基础到企业应用系列5——WPF千年轮回 续前缘
  10. mysql的数据库迁移到另一个机器上