微博功能分析
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)