社交圈数据结构设计(redis实现)

1.player_simple_info pid pid|level|profile_url|name    ----------------hash      

2.player_detail_info: 12345 pid  12345 name kaka guild_id 123 visit_count  100000 gift_count 100 desc 最伟大的人      -----------------hash

3.player_friend_list: 12345 pid1 pid2 pid3   -------------------------- set

4.player_fan_list: 12345 pid1 pid2 pid3 ------------------------ set 

5.player_active_info  pid1 time1  pid2 time2 ----------------------- hash

4.msg_info:mid  12345|time|msg  ---------------------- string

5.msg_list: 12345 time1 mid1 time2 mid2        ------------------sorted set
拉取消息时,可以分页拉取,然后mget msg info。拉取到每条消息的pid,然后hmget player simple info

6.feed_info:fid   12345|comment_count|like_count|content    --------------------string
fid自增产生

7.feed_self_list: 12345 time1 fid1 time2 fid2  -------------sorted set
玩家自己发的feed需要push_back一个feed id,这个feed list作为拉模式生成feed_show_list

8.feed_show_list: 12345  10002  10002    10003  10003  -------------sorted set
拉取feed时,可以分页, 先拉取到fid列表,然后mget feed_info

9.feed_like_list:fid  time pid     --------------sorted set
zadd feed_like_list:fid  1422222222  12345, 增删效率都比较高

10.feed_comment_list:fid   time1 cid1  time2 cid2 time3 cid3 -------------------------sorted set
可以分页,mget  time是 1861920000除了最高位, 861920000 * 100, 如果对这个评论回复一条,就time11就是time1+1

11.feed_comment_info:cid  pid|time|for_fid/for_cid|target_id|content  -------string
评论要标识是对feed的评论还是回复评论,对消息的评论也只是产生一个feed的评论,跟在之前的评论后面

sharding策略:
1.player_detail_info数据量最大,而且不会有mget操作,所以适合做sharding

2.player_simple_info在msg列表或者是feed列表都需要展示出来,所以会有大量的mget操作,如果做了sharding,一个玩家的好友或者被关注可能涉及到多个db的查询操作,效率会降低;同时simple info的数据量很小,比较可控。

3.msg_id要通过自增生成,msg要设置过期时间,拉取msg_list只get一个月内的数据,对于之外的数据,可以在空闲时删除;拉取时分页拉取

4.feed_id要通过自增生成,feed也要设置过期时间,自己发的feed存在feed_self_list中,自己空间的最新feed要从feed_show_list拉取。
1)玩家A发一条feed,需要同时zadd feed_self_list:A和feed_show_list:A
2) 玩家发一条feed,拉取player_fan_list,从player_active_info中hmget各个玩家的活跃时间,去最近活跃的玩家(e.g.  12345),然后分别zadd fid到feed_show_list: 12345   --------推模式

5.查看玩家A的主页feed信息, 查看feed_show_list:A是否存在,如果存在直接分页拉取,如果不存在,将收集每个好友(包括自己)的feed_self_list的前30条,然后push到feed_show_list中,设置feed_show_list的过期时间为1天,然后分页拉取

6.定期清理历史数据,比如没有好友的玩家,msg_info和feed_info都要做expire,同时msg_list和feed_list都要删除不需要的历史数据

master有三个实例:
1.detail_info_db做sharding
2.simple_info不做sharding,可以做slave级联
3.msg_feed不做sharding,可以做slave级联

msg_feed的写入在master,查询可以在任意slave

你可能感兴趣的:(cache)