news 2026/5/6 13:32:05

面试场景题:请设计一个微信朋友圈系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试场景题:请设计一个微信朋友圈系统

一、整体系统方案设计

1. 核心业务特性

  • 功能:发布(文字 / 图片 / 视频)、查看好友朋友圈、点赞 / 评论、删除、权限控制(屏蔽 / 仅自己可见等)
  • 技术特性:高并发(亿级 DAU)、读多写少(查看远多于发布)、数据量大、实时性中等(非强实时)、隐私性要求极高

2. 系统架构分层(微服务拆分)

用户端

接入层:Nginx+LVS

应用层

发布服务PostService

展示服务FeedService

互动服务InteractionService

权限服务PermissionService

中间件层

Redis集群

MQ队列RocketMQ

对象存储OSS

存储层

MySQL分库分表(主从)

3. 核心流程设计

(1)发布朋友圈流程
  1. 用户上传媒体(图片 / 视频)到 OSS,获取媒体 URL;
  2. 发布请求经接入层转发到PostService,校验内容合规、用户权限;
  3. 写入 MySQL 主库(朋友圈主表),异步删除该用户的朋友圈列表缓存;
  4. 可选:通过 MQ 发送 “发布成功” 通知(非核心流程)。
(2)查看朋友圈流程
  1. 用户请求拉取好友朋友圈,转发到FeedService
  2. 调用PermissionService获取该用户的好友列表屏蔽列表
  3. 优先从 Redis 缓存拉取好友朋友圈数据,缓存未命中则从 MySQL 从库读取,再回写缓存;
  4. 对数据做过滤(屏蔽用户、权限校验)、排序(时间倒序)、分页后返回。
(3)点赞 / 评论流程
  1. 请求转发到InteractionService,校验好友关系、屏蔽状态;
  2. 写入点赞 / 评论表(主库),异步调用 Redis 的INCR/DECR更新计数缓存;
  3. 通过 MQ 异步发送点赞 / 评论通知给朋友圈发布者(非实时,最终一致即可)。

4. 高可用 & 高并发优化

  • 服务集群化:所有微服务部署多实例,避免单点故障;
  • 分库分表:按user_id哈希分库分表,解决单库性能瓶颈;
  • 读写分离:MySQL 主库写、从库读,提升读性能;
  • 限流降级:接入层 / 应用层用令牌桶限流,高并发时降级非核心功能(如暂时隐藏点赞数);
  • 隐私校验:所有查询流程前置权限校验,避免泄露非好友的朋友圈数据。

二、缓存方案设计

核心目标:缓存热点数据,减少数据库访问,提升响应速度(Redis 作为核心缓存)。

1. 缓存数据结构与 Key 设计

缓存数据类型Key 设计数据结构说明
用户朋友圈列表feed:user:{user_id}:timelineZSetscore = 发布时间戳,member = 朋友圈 ID,支持排序 / 分页
单条朋友圈详情feed:post:{post_id}Hash存储内容、媒体 URL、可见范围等
朋友圈点赞 / 评论数feed:interaction:{post_id}:like/commentString计数器,用 INCR/DECR 更新
好友列表 / 屏蔽列表relation:friend:{user_id}/blockSet存储好友 / 被屏蔽用户 ID,快速校验权限

2. 缓存更新策略

  • 发布 / 删除朋友圈:先写数据库,再删除缓存(而非更新缓存),避免缓存与数据库不一致(缓存更新失败风险);
  • 点赞 / 评论:先写数据库,异步调用 RedisINCR/DECR更新计数(允许短暂最终一致);
  • 好友关系变更:主动删除对应的好友 / 屏蔽列表缓存,下次访问重新加载。

3. 缓存异常防护

  • 缓存穿透:对不存在的user_id/post_id缓存空值(过期时间 5 分钟);
  • 缓存击穿:热点朋友圈(如大 V 内容)设置永不过期,发布者删除时主动清理;
  • 缓存雪崩:缓存过期时间打散(基础时间 + 随机 0-60 秒),Redis 集群主从 + 哨兵部署。

三、数据库表设计方案

核心原则:满足第三范式为主,适当反范式(JSON 存储)提升读性能,按user_id分库分表。

1. 核心表结构设计

(1)朋友圈主表(moments_post)
字段名类型说明
post_idbigint主键(雪花算法,全局唯一)
user_idbigint发布者 ID(分库分表键)
contenttext文字内容(可为空)
media_listjson媒体 URL 列表(图片 / 视频,如 ["url1","url2"])
visible_scopetinyint可见范围:0 - 全部好友 1 - 仅自己 2 - 指定好友 3 - 不给谁看
target_usersjson可见 / 不可见用户列表(scope=2/3 时非空)
is_deletedtinyint软删除标记(0 - 未删 1 - 已删)
create_timedatetime发布时间
update_timedatetime更新时间
  • 索引:主键索引(post_id)、二级索引(user_id, create_time)(按用户 + 时间拉取)
(2)朋友圈点赞表(moments_like)
字段名类型说明
like_idbigint主键
post_idbigint朋友圈 ID
user_idbigint点赞者 ID(分库分表键)
is_canceledtinyint取消点赞标记(0 - 未取消 1 - 已取消)
create_timedatetime点赞时间
  • 索引:主键索引(like_id)、联合索引(post_id, user_id)(防止重复点赞)
(3)朋友圈评论表(moments_comment)
字段名类型说明
comment_idbigint主键(雪花算法)
post_idbigint朋友圈 ID
user_idbigint评论者 ID(分库分表键)
contentvarchar(512)评论内容
reply_to_idbigint回复的评论 ID(0 = 直接评论)
is_deletedtinyint软删除标记
create_timedatetime评论时间
  • 索引:主键索引(comment_id)、二级索引(post_id, create_time)
(4)好友关系表(friend_relation)
字段名类型说明
relation_idbigint主键
user_idbigint用户 ID(分库分表键)
friend_idbigint好友 ID
block_flagtinyint屏蔽标记(0 - 未屏蔽 1 - 已屏蔽)
create_timedatetime加好友时间
  • 索引:主键索引(relation_id)、联合索引(user_id, friend_id)

2. 表设计关键说明

  • 软删除:所有核心表用is_deleted标记删除,避免物理删除导致数据丢失,方便恢复;
  • 分库分表键:选择user_id(而非post_id),因为朋友圈读写均围绕 “用户” 展开,减少跨库操作;
  • 反范式优化media_list/target_users用 JSON 存储,避免多表关联,提升读效率(符合 “读多写少” 特性);
  • 全局唯一 ID:朋友圈 ID / 评论 ID 用雪花算法生成,避免分库分表后的主键冲突。

总结

  1. 系统架构:按 “发布 / 展示 / 互动 / 权限” 拆分微服务,接入层做负载均衡,存储层分库分表 + 读写分离,适配亿级用户高并发;
  2. 缓存策略:Redis 缓存热点数据(朋友圈列表 / 详情 / 计数),采用 “先写库后删缓存” 保证一致性,通过空值缓存、过期时间打散防护缓存异常;
  3. 数据库设计:核心表按user_id分库分表,软删除 + JSON 反范式优化,索引针对 “用户 + 时间”“朋友圈 ID + 用户 ID” 设计,兼顾性能和业务需求。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 6:20:45

RAG干货:为什么不同召回方式需要不同的chunk策略?看完收藏

文章探讨了RAG系统中语义召回和关键字召回对chunk策略的不同需求。语义召回看重语义相似性,适合有overlap的分块;而关键字召回更适合按段落或句子分块。作者提出混合召回方案,建议按段落和句子分块,配合强大embedding模型&#xf…

作者头像 李华
网站建设 2026/5/1 6:50:37

【干货收藏】企业AI Agent实战指南:从技术原理到工程落地,避坑指南

本文系统阐述企业级AI Agent技术路线,从核心原理到工程落地,解析多智能体架构、大模型应用、记忆机制、系统设计、安全保障及运维部署。强调AI Agent应作为新型生产力单元,具备理解目标、拆解任务、调用工具和闭环执行能力,提出从…

作者头像 李华
网站建设 2026/5/1 23:38:14

大数据深度学习|计算机毕设项目|计算机毕设答辩|基于图像识别的桥梁裂缝识别与检测系统设计与实现

一、项目介绍 随着图像识别技术的飞速发展,桥梁裂缝的智能识别与检测已成为桥梁维护领域的重要研究方向。本文介绍了一个基于Python和YOLO11模型的桥梁裂缝识别与检测系统。该系统结合先进的图像识别和深度学习技术,旨在实现对桥梁裂缝的准确、实时检测。…

作者头像 李华
网站建设 2026/4/30 10:37:33

[硬件设计]运放选型记录

ADS131A04 是一款高精度、同步采样的 24-bit $\Delta\Sigma$ 型 ADC,具有极高的动态范围和极低的噪声要求。而 LM358 是一款通用型、廉价的运算放大器,在精度和速度上完全无法匹配 24-bit ADC 的性能需求。 1. 为什么 LM358 会“拖累” ADS131A04&#x…

作者头像 李华
网站建设 2026/5/5 13:54:48

AI自己学会“地图细胞“和“秘密语言“!程序员:这波操作太秀了,代码都省了!

近日,香港城市大学博士生方政儒和所在团队让一群智能体在虚拟迷宫里共同探索,只给它们一个极其简单的目标——那就是学会预测同伴下一秒会看到什么以及会走到哪里。结果发现这些智能体不仅学会了高效合作,还在自己的“大脑”里自发形成了类似…

作者头像 李华
网站建设 2026/4/30 22:06:53

飞滴网约车项目Day01

今日完成 乘客用户中心服务 验证码发送 首先我们需要开发用户注册和登录功能,其中重点是乘客发送验证码,以下是发送验证码的时序图 REST ful 风格 在设计rest fuk 风格的时候,我们需要考虑以下的事情: 协议(http&a…

作者头像 李华