- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
好友存储结构
好友存储结构
存储要解决的问题:
好友关系,分组,邀请记录数量大
查询量大
数据库一致性保证
解决方案:
序列化存储好友关系及分组数据。
前端缓存
数据结构:
好友列表 :
UID = array(fid1, fid2, fid3 …);
加自己为好友的名单(判断用户是否热点用户) :
UID = array(fid1, fid2, fid3 …);
好友分组 :
UID = array(
array( ‘gid’ = 1, ‘groupname’ = ‘xxx’, ‘order’ =0, data = array(‘uid’, 2, 3, .. )),
array( ‘gid’ = 1, ‘groupname’ = ‘xxx’, ‘order’ =1, data = array(‘uid’, 2, 3, .. )),
…
);
好友邀请:
UID = array(
array( ‘mail’= ‘xxxx@’, accepted=0),
array( ‘mail’= ‘xxxx@’, accepted=0),
… );
用户信息(100byte/条):
UID= array( ‘fid = xxx, ‘name‘ = xxx, ‘note’, …);
好友列表信息:
UID = array( ‘totalcount’ = xx, ‘invite_count’ = 99, ‘request_accepted’ = 88);
Mysql 方案:
用户好友,组记录按USERID分表存储。
每用户好友数据: 假设2000(好友总数) × 2 byte = 4k
串行存储 array(email = testuser_123@, name= 用户, note = 还有备注) 需要110k空间,LONGBLOB 最大允许2048k。
存在的问题:
需要频繁取好友数据资料
特殊用户好友数据量大(几w或更多好友),查询效率低
添加删除好友均需取出全部好友列表,好友数越大IO性能越低。
解决方法:
memcache缓存所有用户基本资料,增加热点用户缓存过期时间,减少非热点用户缓存时间。
为特殊用户使用独立的数据服务器,hash存储好友列表,
可采用先写入日志、更新缓存后队列处理磁盘数据。
架构图#1
Apache Cassandra 方案
Apache Cassandra是一套开源分布式数据库管理系统。它最初由Facebook开发,用于储存特别大的数据。Facebook目前在使用此系统。
主要特性:
1.灵活的schema,不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。
2.支持range查询:可以对Key进行范围查询。
3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。keyspace name=Twitter
columnfamily comparewith=UTF8Type name=Statuses/columnfamily
columnfamily comparewith=UTF8Type name=StatusAudits/columnfamily
columnfamily comparewith=UTF8Type name=StatusRelationships comparesubcolumnswith=TimeUUIDType columntype=Super/columnfamily
columnfamily comparewith=UTF8Type name=Users/columnfamily
columnfamily comparewith=UTF8Type name=UserRelationships comparesubcolumnswith=TimeUUIDType columntype=Super/columnfamily
/keyspace
Keyspace = product (friends)
Column family = table (单独文件存放)
Key = primary key (UUID) 单条记录
Column = field
Value = value
接口:
interface CassandraIf {
public function get($keyspace, $key, $column_path, $consistency_level);
public function get_slice($keyspace, $key, $column_parent, $predicate, $consistency_level);
public function multiget($keyspac
文档评论(0)