热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

大访问量论坛版面帖子列表页取数据方案探讨

背景:最近正在做一个比较大型的论坛的改版工作。论坛在高峰期每秒钟约有10个左右的回帖,3个新帖,论坛的几个热门版面的平均访问量为每天约60wPv。版面帖子的列表页,尤其是列表页的第一页必须是

背景:

最近正在做一个比较大型的论坛的改版工作。

论坛在高峰期每秒钟约有10个左右的回帖, 3个新帖,论坛的几个热门版面的平均访问量为每天约60wPv。版面帖子的列表页,尤其是列表页的第一页必须是根据帖子的最后回复时间严格排序的;否则用户会找不到自己新发的帖子,或者新回复过的帖子。由于帖子表的数据很大,每次都重新从数据库中取数据肯定会出问题,频繁的读写操作很容易导致死锁。

 

2种解决方案

1.       直接将版面的前5页数据(假定每页50条数据)即前250条的帖子数据放到内存中,假定声明了一个变量List newPostList存放这250条的数据;这样有三种情况需要更新这个List变量
1 当有新帖时需要将第一条帖子插入到List0索引处

2 当有帖子被回复时需要首先从List中找到被回复的帖子,如果有就先删除,然后再将回复的帖子插到List的索引0

3 当有帖子被删除时需要从List中找到删除的帖子,如果有就remove掉。

上述方案在当前的访问量下,基本可以满足性能要求,但是时不时的有超时现象出现。另外还有一点就是这种进程内的缓存导致论坛不能向外扩展,若使用2台或以上web server就会有列表页数据不一致的现象。所以趁改版也改一下列表页数据读取方式。

2.       为了扩展性,新版改版决定使用memcached做数据缓存,关于列表缓存最直观的改进方式是将方案1中的List放到memcached server中,但是这样每次更新时都需要更新大量数据,网络IO耗时会很严重。另外鉴于memcached擅于快速处理大量小对象缓存,我想这样设计memcached缓存前250条帖子的id的列表假定为List postIdList;在有新帖,新回复,删除等更新时更新postIdList,另外将帖子对象PostInfo实例作为一个项缓存到memcached中,在列表页取数据时,首先取得PostIdList,根据页码得到一个当前页的Id列表,然后通过MemcachedClient.GetMutiple方法获得这些Id对应的PostInfo,如果某些id对应的缓存不存在时,再从数据库中取数据并和缓存中得到的数据合并。

 

以上两种方案,第一种是运行中的方案,扩展性有问题;第二种方案是构思中的方案,还没有进行实际的测试运行,先晒一下,大家给点意见,建议或新思路。


推荐阅读
  • 方法:1 配置数据库basediros.path.abspath(os.path.dirname(__file__))  #获取当前文件的绝对路径appFlask(__name__ ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 在使用STM32Cube进行定时器配置时,有时会遇到延时不准的问题。本文探讨了可能导致延时不准确的原因,并提供了解决方法和预防措施。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 探讨如何优化MongoDB数据库在长时间未访问后首次查询时的性能问题,提供多种解决方案和最佳实践。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • MySQL InnoDB Double Write机制详解
    本文深入探讨了MySQL InnoDB存储引擎的Double Write技术,该技术通过在内存和磁盘上创建数据页的副本,确保了部分写失效(Partial Page Write)情况下的数据完整性和可靠性。同时,文章介绍了InnoDB以页为单位进行读取和更新的机制,并详细解析了Double Write的工作原理。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
author-avatar
手机用户2502920725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有