微博功能分析
UniqueSet 类
| API | 作用 | 实现原理 |
|---|---|---|
| UniqueSet(client, key) | 设置唯一集合的客户端和键。 | |
| is_include(element) | 检查元素是否存在于唯一集合。 | SISMEMBER |
| add(element) | 将元素添加到唯一集合。 | SADD |
user 类
| API | 作用 | 实现原理 |
|---|---|---|
| User(client) | 设置执行操作时要使用的客户端。 | |
| create(name, email, password) | 根据给定的名字、邮箱和密码,创建一个新的用户,返回用户的 ID 。 | 使用 HMSET 储存用户信息,使用 HSET 在 email 和ID 之间进行关联。 |
| try_login(email, password) | 尝试使用给定的邮箱和密码进行登录,如果成功的话,返回该账号的ID、用户名等信息。根据 email 查找与之关联的用户 ID ,然后根据 ID 取出用户数据,进行密码对比。 |
用户关系
关注与被关注
RelationShip 类
| API | 作用 | 实现原理 |
|---|---|---|
| RelationShip(client) | 设置关系类使用的客户端。 | |
| follow(fans, target) | 让 fans 关注 target 。 | 将 fans 添加到 target 的粉丝集合里面,将 target 添加到 fans 的关注集合里面。 |
| is_following(a, b) | 检查 a 是否正在关注 b 。 | 检查 a 的关注集合是否包含 b 。 |
| is_following_each_other(a, b) | 检查 a 和 b 是否关注了彼此。 | 检查 a 的关注集合是否包含 b ,以及 b 的关注集合是否包含 a 。 |
| get_all_following(user) | 返回用户关注的所有人。 | 返回用户的整个关注集合。 |
| get_all_fans(user) | 返回用户的所有粉丝。 | 返回用户的整个粉丝集合。 |
| common_following(a, b) | 返回 a 和 b 共同关注的人。 | 计算 a 和 b 的关注集合的并集。 |
发微博
储存微博并将它广播至各个时间线
Message 类的实现
| API | 作用 | 实现原理 |
|---|---|---|
| Message(client) | 设置客户端。 | |
| create(author, content) | 储存一条微博,并返回该微博的 ID 。 | 使用 HMSET 将微博的相关信息储存到一个散列里面。 |
| get_by_id(message_id) | 根据 ID 查找微博。 | 使用 HGETALL 获取储存在散列里面的微博信息。 |
时间线
按照发表时间的先后顺序来储存微博
程序会为每个用户储存两条时间线:
- 定制时间线,包含了用户自己以及用户正在关注的人发送的微博,键名为 weibo::user::id::custom_timeline 。
- 个人时间线,只包含用户自己发送的微博,键名为weibo::user::id::personal_timeline 。
Timeline 类
| API | 作用 | 实现原理 |
|---|---|---|
| Timeline(client) | 设置客户端。 | |
| custom_push(user_id, msg_id, time) | 将微博推入到用户的定制时间线里面。 | 使用 ZADD 将微博 ID 添加到代表定制时间线的有序集合里面。 |
| personal_push(user_id, msg_id,time) | 将微博推入到用户的个人时间线里面。 | 使用 ZADD 将微博 ID 添加到代表个人时间线的有序集合里面。 |
| broadcast(msg_id, time, *fans_ids) | 将微博推入到所有给定用户的定制时间线里面。 | 遍历传入的所有用户 ID ,对每个ID 都执行一次 custom_push 。 |
| custom_paging(user_id, n, count) | 按每页 count 条微博计算,获取用户定制时间线第 n 页的微博。 | 使用 ZREVRANGE 以从新到旧的顺序取出有序集合储存的微博 ID 。 |
| personal_paging(user_id, n, count) | 获取用户个人时间线第 n 页的微博,按每页 count 条微博计算。 | 使用 ZREVRANGE 以从新到旧的顺序取出有序集合储存的微博 ID 。 |
为微博点赞
支持自己喜欢的微博
LikeMessage 类的实现
| API | 作用 | 实现原理 |
|---|---|---|
| LikeMessage(client, msg_id) | 设置客户端和要进行操作的微博。 | |
| like(user_id) | 用户对微博点赞。 | 将用户 ID 添加到集合里面。 |
| is_liking(user_id) | 检查用户是否赞了该微博。 | 使用 SISMEMBER 检查用户 ID是否存在于集合。 |
| undo(user_id) | 取消用户的点赞。 | 使用 SREM 将用户 ID 从集合中移除。 |
| count() | 获取该微博的点赞人数。 | 对集合执行 SCARD 。 |
| get_all_liking_user() | 返回所有赞了该微博的用户。 | 对集合执行 SMEMBERS 。 |
评论微博
对微博内容进行讨论
Comment 类
| API | 作用 | 实现原理 |
|---|---|---|
| Comment(client) | 设置客户端。 | |
| create(author, content) | 创建评论。 | 使用 HMSET 将评论储存到散列里面。 |
| get_by_id(comment_id) | 获取指定的评论。 | 使用 HGETALL 获取散列储存的评论信息。 |
CommentList 类
| API | 作用 | 实现原理 |
|---|---|---|
| CommentList(client, message_id) | 设置客户端以及被评论的微博。 | |
| push(comment_id) | 为微博添加评论。 | 使用 LPUSH 命令将评论ID推入到列表里面。 |
| count() | 获取微博目前的评论数量。 | LLEN |
| paging(number, count) | 按每页 count 条评论计算,获取该微博第 number 页上的评论。 | LRANGE |
转发微博
在一条微博里面引用另一条微博
修改之前发微博的接口,改为:create(author, content, origin_message_id=None)
本文详细介绍了微博系统的架构设计与核心功能实现,包括用户管理、微博发布、点赞、评论及转发等功能。通过Redis数据结构实现了高效的时间线更新、用户关系维护及消息传播。
433

被折叠的 条评论
为什么被折叠?



