关于用户动态信息查询的讨论

简介:

坛子里有朋友问,关于在线用户动态信息的管理,应该如何设计数据库以及优化,正好本人碰到过类似的问题,谈了一点看法,这里保存下来,供大家参考。

这个问题我看了很久,也很想看看大家的分析,一直在思考。 
这实际上是一个比较普遍的问题,几乎所有论坛、IM软件、社区、博客之类的,需要用户验证和状态查询的软件系统,都会碰到这个问题。 
我在工作中也有碰到。 
经过思考,我认为这是一个业务优化问题,而不是一个功能优化问题。 
这里面有一个惯性思维,我们把用户信息放到数据库中,已经有了这个框架了,因此,以后我们处理问题,第一直觉就是如何想办法优化数据库,包括重新组织表,加事务,加查询之类的机制,来提升某个瓶颈业务的性能。 
但大家有想过没有,这实际上变成了一种毫无规划,头疼医头,脚疼医脚的打补丁行为。数据库已经成型,很难更动,如果要加针对性的查询表,加太多了,实际上数据库恶性膨胀,整体看来,平均能力更为降低,得不偿失。 
数据库提供的,仅仅是数据存储功能,如果依赖数据库来做查询,这本来就不是它擅长的业务,因此这个时候,我觉得我们有必要跳出框框来看问题了。 
仔细分析一下,其实问题很简单,我们有一个数据库,里面存了用户所有的信息,包括在线状态等动态信息,现在我们有一个需求,即查询一个人的n个好友的在线状态,因此,引发一次数据库的select,然后发现性能很低,我们需要优化。 
ok,我们的关键需求仅仅是查询一个人n个好友的动态信息。 
那我们可不可以考虑,如果这件事不让数据库来办,而是我们在网上单设一个服务,这个服务就是为大家快速提供每个人的动态信息的,只要client端丢过来一个查询的用户id列表,server端即回送这个列表中所有用户id的状态,至于怎么存储,怎么查询来得快,我们先不考虑,我们关心的是,如果有这个service存在于网络上,我们的问题就解决了? 
答案是肯定的。如果有这个service,我们还要数据库干什么? 
ok,我的解决方案就出来了。 
一个用户的动态信息部分,最多几十个bytes就解决了,我们预设64bytes,我们预设一个server专门存储用户的动态信息,100w吧,服务100w用户。 
64*100w=64M 
现在的计算机内存多少?家用机普遍1G。 
这个表,放到内存里面绰绰有余。 
ok,我现在写一个服务进程,叫ActiveUserInfoService,在,比如说60000端口监听,专门提供这个服务,在原有Server上做个转向,即查询动态信息的所有信令报文,我全部转到这个服务进程ActiveUserInfoService上处理,自己不再负责查询。 
客户端上线,丢一个Add信令,下线,丢一个Del,查询,丢一个RequestActiveInfo(List* pUserList)信令过去。 
这个Service就处理这三个信令就好了。 
然后我们来讨论,大家发现,当所有信息都在内存的时候,我们的方法就太多了,什么平衡二叉树,哈希map==,有太多的方法来优化这个查询速度。 
而且,甚至我们可以把Add和Del信令做成异步的,就是收到后,打入队列,立即返回,避免MasterServer发生阻塞。 
我们只需要建立这样一个小小的Service,前文所述的所有的数据库优化,其实全都不必要了。 
这就是我想说的重点:当一个优化走到极致,我们应该跳出思维框框,开始从架构上、系统上想办法,而更进一步,我们每次面临一个优化需求的时候,我们甚至都要想,能不能不碰数据库,有没有其他办法解决。可不可以通过服务器集群的方式,自然解决。 
数据库是功能层,提供数据存储和提取的功能,在其中做优化,很难做到针对性优化,只能做普适性优化,效果很差,如果我们到业务层来,针对单笔业务,做特定优化,其实路子会宽很多。 
呵呵,一家之言哈,欢迎拍砖。

本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/198492 ,如需转载请自行联系原作者

相关文章
|
2月前
|
小程序 物联网 程序员
【社区每周】“小程序商品”能力接口字段更新(10.23-10.29)
【社区每周】“小程序商品”能力接口字段更新(10.23-10.29)
35 0
|
SQL 数据安全/隐私保护
通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤
查看上篇文章通用数据级别权限的框架设计与实现(2)-数据权限的准备工作,我们开始数据列表的权限过滤. 原理:我们在做过滤列表时,根据用户权限自动注入到相关SQL中,实现相关过滤,如果拥有全部权限,则不生成相关SQL片段 首先我们来分析一下数据列表的SQL 能看到所有数据的SQL SELECT role.
1124 0
|
1月前
|
存储 移动开发 小程序
利用微搭搭建信息查询小程序
利用微搭搭建信息查询小程序
|
3月前
|
前端开发
【简历优化平台-02】缺失信息和不规范信息的过滤层
【简历优化平台-02】缺失信息和不规范信息的过滤层
|
3月前
|
人工智能 算法 测试技术
【简历优化平台-03】轻字段信息的合理性及单独算法
【简历优化平台-03】轻字段信息的合理性及单独算法
|
缓存 前端开发 JavaScript
四个简单例子教你通过用户行为记录提高用户体验
四个简单例子教你通过用户行为记录提高用户体验
143 0
四个简单例子教你通过用户行为记录提高用户体验
|
安全 Java 开发者
案例之资源服务中加入校验用户所需对象|学习笔记
快速学习案例之资源服务中加入校验用户所需对象
62 0
案例之资源服务中加入校验用户所需对象|学习笔记
|
Java 数据安全/隐私保护 开发者
【实验】-员工列表-公共页抽取|学习笔记
快速学习【实验】-员工列表-公共页抽取
90 0
【自然框架】之通用权限(八):权限到字段(列表、表单、查询)
 通用权限想要写的文章目录:(这是第八章)   1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到按钮8、 权限到列表(表单、查询)9、 权限的验证10、 资源方面的权限11、 角色管理的程序(给客户用的)12、 权限下放13、 个性化设置A、 【自然框架】之通用权限(外传):杂谈     列表 myGrid 先说一下myGrid,我会根据Manage_FunListCol表和Manage_Columns表的内容,绘制出来一个table,就是的HTML。
877 0
|
自然语言处理 搜索推荐 索引
搜索引擎对用户搜索词如何处理,怎么判断用户搜索词的结果?
搜索引擎接收到用户输入的搜索词后,需要对搜索词做一些处理,才能进入排名过程。
176 0