AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

系统设计问题2------用户系统设计(2)

作者: 作者的头像   hpstory ,  2022-10-04 22:24:11 ,  所有人可见 ,  阅读 382


0


目录

0.基础概念
1.新鲜事–消息流的实现方式
2.用户系统(1)–缓存

Cassandra

结构

包含三层,row_key, column_key, value

Cassandra的key = row_key + column_key,同一个key只对应一个value

cassandra_column_family.jpg

row_key

又叫Hash key,数据库根据row_key计算一个hash值,然后决定整条数据存储位置,不支持范围查询,适合用来记录user_id

column_key

一般用来指定按照什么顺序来进行查询,支持范围查询(例如column_key保存时间相关的信息)
常用的两个操作:

  • insert(row_key, column_key, value)
  • query(row_key, column_start, column_end)

Friendship Service

好友关系

  • 单向好友关系(可以单方面关注,不需要对方确认)
  • 双向好友关系(关注并确认后,双方互为好友关系)

保存在SQL数据库中

数据结构

Capture1.PNG

  • 查询某人所有关注对象
  • select * from friendship where from_user_id=x
  • 查询某人所有粉丝
  • select * from friendship where to_user_id=x

保存在NoSQL数据库中

数据结构

Capture2.PNG

SQL vs NoSQL

  1. 大部分情况下,用哪种数据库都是可以的
  2. 如果对数据库的事务有要求的话一般选择SQL,高版本的Mongodb也是支持事务的
  3. 用于结构化的数据,需要支持索引,选择SQL。而NoSQL适合分布式,replica
  4. 对于User表,一般使用SQL,而对于Friendship表,一般使用NoSQL,数据简单,效率更高

共同好友

  1. 获取A的好友列表
  2. 获取B的好友列表
  3. 求交集

优化:将好友列表的查询结果缓存起来

六度好友关系

六度关系理论: 最多通过六个人你就能够认识任何一个陌生人。

Capture3.PNG

  • A和B之间是一度关系
  • A和C之间是二度关系
  • A和D之间是三度关系
  • 一般来说,三度以上关系是没有现实意义的,可以直接显示3+
求A和C之间是几度好友关系

不能使用BFS来进行计算,假设每个人有1000个好友的话,二度关系的计算数量就可以到达百万级别,对于一个线上系统来说是没办法接受这个数量级的计算,时间复杂度应该控制到有限次数O(1)。

实际可以通过离线处理,提前算好所有的一度二度关系并保存在NoSQL中。

查询A的一度(直接好友)关系得到一个集合1
查询C的一度关系得到集合2
如果集合1和集合2有交集,则A和C为一度好友关系
查询A的二度(间接好友)关系得到一个集合3
如果集合1和集合3有交集,则A和C为二度好友关系
如果没有交集则为3度以上好友关系

这样对于一个请求只需要最多3次查询就可以得到结果。

1 评论


用户头像
AdamChen   2022-10-19 13:59         踩      回复

正在学习系统设计相关的,大佬写的非常好。


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息