首先说一下问题的出处:公司某个项目组有一个需求,获取所有关注人的文章列表。乍一看,感觉貌似挺简单,那就获取吧,通过uid获取所有关注人的uid数据集合,然后通过对应的uid,获取文章id不就可以了吗。可是细想,不对。一个人可以关注N个人,N可能是100,也可能是1000,关注的人发得可不是一篇文章,人家心情好,可能发个10篇,20篇,那这样算下来如果关注1万个,一个人平均发文一千篇,那两级就是千万数据。
【最初思路一】
一遇到这种千万级的数据,就相当于nosql的作用了。我们最初思路一致认为redis处理最是合适,因为mysql服务器承担千万级的数据,容易崩溃。所以得出以下方法:
这样的弊端就是redis数据存储会越来越多,如果redis服务器哪天一抽风,所有数据就丢了,并且关注上限没有设定,发文也没有上限,数据量会随着时间推移进行增长。
【思路二】
上面的方法类似于订阅数据存储,后来经过讨论想到redis队列推送数据,同事说php-request消息队列是不是可以实现这个功能,可是数据量太大的话,推送显然不合适。然后我们就想到朋友圈类似这个功能,只要互加好友,就可以查看该好友的朋友圈信息,一个人有多个好友,一个好友会每天发朋友圈,所以我们每天刷新朋友圈的时候,为什么觉得人家的数据怎么超快呢。然后就细思考朋友圈数据存储的原理。
【思路三】
就是新建一个数据表,设定关注uid,被关注uid,文章id,还有其他信息存储。关注uid,被关注uid,文章id建立唯一索引。关注uid,搜索时建立查询索引。文章id如果需要,也可以建立查询索引。每次定时同步这个数据表,单表查询,外层再和redis结合,我想速度一定不会太慢,因为所有字段都是int类型,也不会耗费数据内存。后期这个表会越来越大,反正是一个表,怎么都好处理,数据量如果特别大,可以分表,减少查询数据列,提高查询数据。
具体逻辑比较清晰,关注UID和文章ID是多对多的结构。此思路是我之前一个同事,任鹏借鉴网上谈论朋友圈存储数据的文章想的。在这里特别感谢。
未经允许不得转载:任鹏个人博客 » 模拟朋友圈数据存储原理
最新评论
Forex wiki. https://lt.forex-stock-bitcoin-brokers.com
Magnificent items from you, man. I have take note your stuff
Following on from the 3rd March Meetings held by economic de
It is remarkable, rather valuable message dfgdlfg2131.32
一般都会有一个沙盒期的,过了沙盒期就会慢慢放出来
百度不收录是应为是新站的原因吗?
The spike in consumer prices that left inflation at a four-d