现在维护一个项目,先说说数据库的情况:
生产环境的用户量(用户表)为:1700W。
用户的关注、好友在Friends表中,记录数为:3600W,现在每天的增长量为30W左右。
id --主键,自增长
userid --用户ID
username --用户名 (冗余)
targetuserid --对方用户id
targetusername --对方用户名
friendtype --是否为好友
现在考虑对friends表做拆分,我的方法是按二个维度做拆分,也是通用做法:分成关注表与粉丝表,再对关注与粉丝做水平拆分。
这意味着:二个人的相互关注,会产生4条记录,记录数会比单独的friends表要多,但这样拆分会换来效率上的提升,这还是值得的。
最终大家还是觉得只对friends表做水平拆分,按userid区间分表,这样可以最大力度保持原表结构及原有的业务逻辑。
但这样会带来新的问题:即无法按targetuserid查找粉丝。
现在想把关注与粉丝放到Redis中,但似乎list/set都无法完全满足需求:
set可以去重,但无法用原生命令取某一区间的值(体现在分页上)。
list无法去重,但可以取某一区间,但同时,list也无法删除指定的value(比如取消对某一用户的关注)
对于分表目前来说是对friends表水平拆分,这个基本确定了,但Redis这一块有什么好办法?新浪微博也是用的Redis维护关系,它们是怎么做到的?
生产环境的用户量(用户表)为:1700W。
用户的关注、好友在Friends表中,记录数为:3600W,现在每天的增长量为30W左右。
id --主键,自增长
userid --用户ID
username --用户名 (冗余)
targetuserid --对方用户id
targetusername --对方用户名
friendtype --是否为好友
现在考虑对friends表做拆分,我的方法是按二个维度做拆分,也是通用做法:分成关注表与粉丝表,再对关注与粉丝做水平拆分。
这意味着:二个人的相互关注,会产生4条记录,记录数会比单独的friends表要多,但这样拆分会换来效率上的提升,这还是值得的。
最终大家还是觉得只对friends表做水平拆分,按userid区间分表,这样可以最大力度保持原表结构及原有的业务逻辑。
但这样会带来新的问题:即无法按targetuserid查找粉丝。
现在想把关注与粉丝放到Redis中,但似乎list/set都无法完全满足需求:
set可以去重,但无法用原生命令取某一区间的值(体现在分页上)。
list无法去重,但可以取某一区间,但同时,list也无法删除指定的value(比如取消对某一用户的关注)
对于分表目前来说是对friends表水平拆分,这个基本确定了,但Redis这一块有什么好办法?新浪微博也是用的Redis维护关系,它们是怎么做到的?