微博关注我、我关注你数据库该怎么设计
2016-05-18 17:44
239 查看
微博关注是根据什么来知道你关注我,我关注你了?数据库怎么设计?
尤其是一个明星,他有上百万上千万粉丝:解决方案有两个思路:
1 由被关注者主动推数据
2 由被关注者向粉丝推送一个通知,然后由粉丝去拉数据
不过这样就意味着他发一条消息需要有千万个人来访问这张消息表或发一条消息需要写向千万个粉丝的消息表写数据。
第一种方案,应该是每个人都有一张自己的消息表。当被关注者发消息时,会将此消息写入关注者的消息表中,内容大概有被关注者id、消息内容、发送时间。这里最大的问题在于要向千万张表写数据。
第二种方案,每个人的消息只存储在自己的消息表中,当自己发消息后,写入。然后由其所有关注者定时从这张表中取数据。或者当自己发消息后,向所有关注者发一个通知,比如发个1,关注者就来自己的消息表取数据。这种方法当某人粉丝数量很多时,会造成这张表的并发读操作非常高。
简单的看,两种方案都有利弊。但都还有很大优化空间。新浪微博两种方案都用过。并且在这过程中也摸索出了一些经验。
第一种方案他们采取过分批推送的策略,会将用户按活跃度划分几个等级,推送顺序是按照用户活跃度等级来决定的。分批推送一定程度上减轻了负担。
第二种方案可以采用冗余多份数据负载均衡的办法将那一张表的并发读操作均衡开。比如我有一张消息表,但这张消息表存储n份,在n台服务器上,内容完全一致。当我发消息时同时向这几台服务器的表写数据,或者分批写入,然后我不同的粉丝,会根据一定策略来决定去哪台服务器读。这里也可以将用户活跃度作为参数,活跃度高的粉丝去服务器a读(服务器a中的消息表在分批写入时最优先被写入)
想来想去,方案似乎就两种,但可优化的地方还很多,例如在读取数据时,加入cache层,cache层只存储每个用户最近发表的消息,数据定期归档。
参考:
http://bbs.csdn.net/topics/390333084?page=1
相关文章推荐
- mysql的日期类型date, datetime, timestamp
- redis python-redis 安装详细步骤
- winserver2008 Oracle 11g 安装
- mssql表变量和临时表
- 【MongoDB】MongoDB入门(一)基本操作&常用命令
- 重置mysql密码
- SUN(oracle)存储配置界面
- 如何在Windows系统下安装多个Redis实例
- mongodb.conf配置文件详解
- 超强、超详细Redis数据库入门教程
- oracle数据库导入导出步骤
- 查询某段时间耗时sql
- redis lru data 捕捉与存储
- SQL中IMAGE类型转字符串
- redis命中率计算
- redis命中率计算
- 在windows编译MariaDB
- SQL_Server_2005_函数大全
- MYSQL 升序排序但值为0的排最后
- 修改mysql中root出错导致mysql数据库消失解决方法