现在大部分SNS网站都有一个功能,就是显示好友的活动状态,比如你的好友上传了一张照片、分享了一篇文章等等动作,都可以显示在你的页面里,这样大大增强了社区的互动性,也成为现在SNS网站的主要特征,对于这样一个功能,从设计角度,还是值得思考的,并不简单,特别是用户越来越多,信息海量增长的时候,我未必能提出十全十美的方案,但我们可以由简如繁梳理一下思路。

首先我们要定义用户的活动消息,也可以理解为一个事件,就是我们举的例子:用户上传照片、与别人结为好友、修改了个人资料等等,动作各有不同,但需要在结构上通用,我们先设计一个

ID //消息ID
UserID //用户ID
MsgType //消息类型,比如加好友、上传照片等不同的类型
EventMsg //消息的内容,这里我们可以用Json的数据格式来描述出不同的活动内容
CreateTime //消息创建时间

这个结构也是个数据库的结构,当用户做个一个动作之后,就会创建这样一个消息,并保存在数据库中,当显示好友的活动信息时,就从这张表里查询自己好友id的数据,并按时间显示,这个做法是一个最简单的实现,但会出现一些问题,当你与一个用户成为好友之后,该好友之前发生的动作会显示出来,而不是在成为好友时点之后的动作,同样,切断好友关系之后也有类似的问题,如果从业务角度和用户体验上可以接受的话,也没什么,但由于信息是按时间排序,有时候会给用户错乱的感觉,还有,这个信息不能删除,如果删除了所有好友就看不到这条信息了,但在Facebook里是则是可以删除好友的动作信息的,这个方法还有一个问题是,所有信息都放在一张大表里,在信息爆炸增长,个人好友也很多的情况下,查询效率会非常低,产生严重的性能障碍,如果对这张表做水平切分,则在实现上复杂了许多,性能也未必好很多,接下来我们再思考是否有更好的解决办法。

在SNS的理论里,个人好友的合理数量在150个左右(最近有文章说Facebook的人均好友数是120人),SNS网站应该是有好友数量的限制的,我们就按人均150个好友来设想,是否可以在用户发生某些动作之后,针对他的所有好友都写入一条信息,所能解决的是,信息是在用户成为好友时点之后写入,用户可以删除好友的活动信息,不影响其他用户的显示,在显示时查询效率要高很多,但是负面效应也十分明显,一个用户的动作有平均150个写入,对于数据库来说开销也非常大,我们想想在这样的设计下,是否可以提高性能。

首先看数据库设计,我们要把信息表和信息与用户的对应表分开,我们上面定义的数据结构保留,我们定义它的表名为Event,我们再新建一张表EventUser,结构如下

ID  //主键
EventID //Event表的ID
FriendUserID //好友的ID
CreateTime //消息创建时间

对FriendUserID做索引,当用户发生动作时,首先将动作信息写入Event表,之后查找用户的所有好友,将EventID、好友ID逐条写入EventUser表,当要显示自己的好友活动信息是,查询EventUser中FriendUserID等于自己ID的信息,并和Event表做一个Join查询就可以了。

进一步提升性能的方法,将Event里的信息缓存,比如用Memcached,EventID做为Key,内容做为Value,这样,查询EventUser是就不用Join Event表,而是从缓存里读取,由于要记录给每个好友的信息,所以EventUser会变得非常大,平均要比我们最初设计的数据容量大150倍,我们对EventUser表做水平切分,根据用户ID做Hash算法,基本上能均匀的分配到所有的表中,至于EventUser水平切分的算法还有多种,根据实际情况来定,总的来说就是把数据分摊掉,同时EventUser里的数据可以不永久保存,做定期删除,可以保持数据容量在一个合理的范围内。

对于用户动作之后的数据写入,可以采用异步的方法,在发生动作时,抛出一个消息,由另外一个线程在做写入操作,如果对每个动作平均150次的写入仍存顾虑,我们可以针对每个用户开出一块内存空间,或是缓存,里面保存最后50条最新的好友动作,并在每条记录里做一个持久化标志,当有50条信息都标志是“未持久化”时,做一次数据库的写入,然后把信息置为“已持久化”,这种非实时写入的方式,可以提高一定的数据库效率,显示时,先从内存中取出,再查数据库。

还有一些问题,对不不同消息类型的处理方式不同,比如用户修改个人资料,并不是每次发生这样的动作都要做一次给朋友做一次“群发”的操作,如果遇到这个人在短时间内做了多次修改个人资料的操作,就给朋友发出多个消息,会产生垃圾信息,让人觉得很怪异,所以对于这样的操作会有一定的时效性,比如在一天之内的修改个人资料,就是一个消息,这时候的处理是更新,而不是插入。

以上是我对SNS中好友动态功能的设计思路,可能还有一些未想到的问题,还需要认真思考。

SNS中好友动态功能的设计思路相关推荐

  1. SNS应用好友动态Feed模块设计

    转载自:http://libo93122.blog.163.com/blog/static/122189382012112145728902/ 备注:找不到原作者了. 现在大部分SNS网站都有一个功能 ...

  2. SNS社区好友动态设计思路

    现在大部分SNS网站都有一个功能,就是显示好友的活动状态,比如你的好友上传了一张照片.分享了一篇文章等等动作,都可以显示在你的页面里,这样大大增强了社区的互动性,也成为现在SNS网站的主要特征,对于这 ...

  3. Microbiome:在人工肠道中建立动态线性模型指导设计和分析微生物组研究

    文章目录 在人工肠道中建立动态线性模型指导设计和分析微生物组研究 导读 摘要 主要结果 图1. 技术变异掩盖了微生物动态的模型 图2. 10个最高丰度细菌科随时间变化 图3. 生物和技术变异的结构和幅 ...

  4. 实现动态表单功能设计思路

    实现动态表单功能设计思路 文章目录 **实现动态表单功能设计思路** 一.业务场景 二.设计思路 三.数据库设计 四.页面展示 操作流程 部分代码 一.业务场景 业务只涉及简单的增删改查,但是业务类型 ...

  5. 【转】从工作中总结的游戏场景设计思路浅谈(一)

    假设在一款游戏刚刚开始进行设计制作的时候,我们刚刚开始入手,如何顺利的完成,并且是可行.正确无误的设计呢?让我们一步步来看吧. 设计工作可以分解成 四个部分 组成,而其中每个部分又可以分成几个步骤进行 ...

  6. sunplus8202v BIN文件中LOGO的替换工具设计思路

    原创文章,如有转载,请注明出处:http://blog.csdn.net/desert2009sz/article/details/6871758 由于前段时间在做单游戏手柄的无线转换方案,所以收集了 ...

  7. 碎片数据收集利器-结构化动态表单设计思路

    本文基于面向基本公共卫生的业务系统设计经验,抽象出一套适合大型ERP系统的表单业务数据模型,目标是最大限度保留系统弹性的同时,尽可能降低系统复杂度和开发成本.enjoy~ 背景 填写表单应该是所有业务 ...

  8. (二十)WebGIS中图层树功能的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS的桌面工具中,比如arcgis desktop或者S ...

  9. php网站设计思路,[PHP] 中英双语网站的设计思路

    1. 前几天开发一个  , 实现思路大部分情况下 , 我们可以想到是使用一个语言包数组文件 . key和value的形式 , 我们在展示界面时 , 输出数组对应的key而不是固定写死这个值 大概的设计 ...

最新文章

  1. JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html
  2. 不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
  3. 如何创建sequence
  4. Yii 文件上传类的使用
  5. Kotlin — 在一个项目中混用 Java 与 Kotlin(混合开发)
  6. simplemind pro for Mac(思维导图)
  7. 【SPOJ:FAVDICE】Favourite Dice(概率dp)
  8. element-ui表单验证时需要number类型
  9. 王曙燕c语言答案,c语言程序设计王曙燕课后题答案
  10. 读《IPD华为研发之道》笔记
  11. 物联网(工程师)+嵌入式学习路线图各个阶段
  12. Netty8# Netty之ByteBuf初探
  13. 第三篇 ME909s-821设备描述符分析
  14. tongweb7启动参数配置配置个人理解
  15. 2DPCA—二维主成分分析详解及编程
  16. SPI通信协议详解,一篇就够!
  17. 漫反射与高光反射总结
  18. SSM框架实现登录注册功能
  19. Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用
  20. 加法的横式竖式教案c语言,列加法竖式教案

热门文章

  1. 【操作系统】32位和64位
  2. 解读CIO角色 他们每天做什么? [zt]
  3. Egret 之消除游戏开发 PART 5-张鑫磊-专题视频课程
  4. 国稻种芯百团计划行动 杨远柱:为世界粮食安全献“粮”策?
  5. 网易最新视频剪辑课程来了
  6. xampp服务器无法启动mysql服务
  7. 计算机毕业设计基于微信小程序的驾校报名系统
  8. Idea maven无法下载jar问题解决
  9. 数据结构|二叉树前序、中序、后序遍历C++代码实现(递归)
  10. java基于微信小程序的个人家庭收入支出记账本小程序 uniapp