新浪微博大V的粉丝列表 是如何存储?

一千年前的人 发布于 2014/06/12 20:16
阅读 3K+
收藏 1

大V的粉丝极多,例如李开复有5000w+粉丝,陈坤有7000w+粉丝。新浪微博是如何存储这种粉丝关系的?

新浪微博关系服务与Redis的故事   说 新浪微博仅仅存储大V的最新5000个粉丝在Redis (使用的是hashmap的数据结构),岂不是造成大V粉丝列表不完整?

各位大牛,听听你的设计。

加载中
0
JFinal
JFinal

引用来自“一千年前的人”的评论

虽然不是JFinal的问题,还是请友情援助一下  @JFinal   

    为了实现数据的完整性,可以在已有的 key value 结构上引入中间数据结构,以粉丝列表数据结构为例,大致如下:

struct RelationNode {
   fansAmount     粉丝数量
   fansListKey  通过该 key 从 reids 中获取粉丝列表
   fansListExtKey 超出最大显示数量时利用此 key 去 reids 中仍可获取粉丝列表
   // 关注、双向关注等其它关列类似处理,此处省略下面的结构定义

 }

fansListKey 的生成规则可以是 uid + Fans 如:12345Fans
fansListExtKey 生成规则可以是 uid + ExtFans 如 12345ExtFans

从 reids 中读取粉丝数据
1:通过 uid 读取 RelationNode 对象: uid ---> relationNode
2:通过 relationNode.fansListKey 读取粉丝列表: relationNode.fansListKey ---> fansList

3:通过 relationNode.fansListExtKey 读取超出部分的粉丝列表 relationNode.fansListExtKey ---> fansExtList

    以上只是一个很直白的简单的方案,具体实现时可以有很多的优化,例如 fansListExtKey 可以省去,仅仅去利用约定的生成方式就可以得到 key 值,还可以对超出 5000 的粉丝进行分页存放,那么生成的 key 可能是 uidFansListKeyPn (n >= 1)

Pn 可以通过 fansAmount 与 pageSize 计算出来

    经过优化过的方案,读取方式可能如下:
1:通过 uid 读取 RelationNode 对象
2:通过 fansAmount 与 pageSize (假定是新浪微博使用的5000) 得到 Pn

3:通过 uid + FansListKey + Pn 得到某一页的粉丝,如:12345FansListKeyP1,第一页正好是需要显示的 5000 个

     当然,上面的设计只是大致解决存取的问题,要做一些复杂业务时可能还要继续优化,例如需要得到某两个人共同的粉丝列表,假如是两个大 V 共同的粉丝列表可能会出现性能问题

    总体的设计方向是引入一个或多个中间数据结构并且分多步对 reids 进行存取,再根据具体的业务规模与特点进行数据结构和算法的进一步优化

一千年前的人
一千年前的人
不愧是JFinal架构师,确实是一个很好的解决思路!!学习了!!
2
南湖船老大
南湖船老大

多虑了。互联网应用根本不需要讲究严谨啊,都是牺牲数据一致性和完整性来获取性能的。


南湖船老大
南湖船老大
回复 @一千年前的人 : 互联网应用就是这样的,用做传统应用的眼光看,是不对的。
一千年前的人
一千年前的人
数据也太不完整了。。。
一千年前的人
一千年前的人
汗。。。
1
zachary124
zachary124
好像是大于多少万的存储到文件了。
一千年前的人
一千年前的人
一起想想,用什么结构存储,效率最好
一千年前的人
一千年前的人
有道理! 我也觉得专门定制(选择)一种存储机制来存储这么大的数据才合适。
1
ArrayListt
ArrayListt

其实5000W+

到底是多少,上面也没有显示啊。

很可能到达一定数量了,粉丝的数据,可能不会是实时了。

也许1w更新一次,也许1天更新一次。

这也说不定。

一千年前的人
一千年前的人
页面上最多只显示 10页。 要查看后面的粉丝,系统就会提示 由于系统限制,无法查看所有粉丝。。
0
iamlatpaw
iamlatpaw

你碉堡了

一千年前的人
一千年前的人
回复 @Zoker : 哈哈,有意思
Zoker
Zoker
回复 @一千年前的人 : 层主不是说你提的问题怎么怎么样,是说你的名字配合sidebar的那段话“一千年前…的其他问题”
一千年前的人
一千年前的人
回复 @Zoker : 啥意思?
Zoker
Zoker
回复 @一千年前的人 : 一千年前的其他问题,时间才是重点。
一千年前的人
一千年前的人
因为不懂,所以多向大家请教。
下一页
0
一宁
一宁
据说新浪现在维护的是号称世界上最大的redis集群
0
五杀联盟
五杀联盟
数据冗余是必须的
返回顶部
顶部