news 2026/6/10 14:03:14

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

作者头像

张小明

前端开发工程师

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/6/10 11:19:43

AI开发新风口!RAG技术从入门到精通,解锁大模型新技能,限时免费认证等你来!小白程序员也能秒变RAG大神!

一、 RAG 工作流程 检索增强生成(RAG)系统代表了大型语言模型(LLM)应用架构的重大演进,它将 LLM 的强大生成能力与外部知识库的实时性、准确性相结合,形成了一个高效、可靠的知识闭环。理解 RAG 系统的完整…

作者头像 李华
网站建设 2026/6/10 10:39:24

机器学习模型在大数据环境下的部署方案

机器学习模型在大数据环境下的部署方案 引言 痛点引入 在当今数字化时代,数据量呈爆炸式增长,大数据环境已成为常态。机器学习模型在众多领域展现出了强大的预测与分析能力,从图像识别到自然语言处理,从金融风险预测到医疗诊断…

作者头像 李华
网站建设 2026/6/10 12:01:47

大数据深度学习|计算机毕设项目|计算机毕设答辩|排水管道病害智能辨识算法研究

一、项目介绍 随着城市化进程的加速,排水管道病害的高效检测和分类变得愈发重要。本文介绍了一个基于深度学习的排水管道病害智能辨识系统,该系统融合了计算机视觉和深度学习技术,致力于实现对排水管道病害的精准、即时分类。系统的核心功能涵…

作者头像 李华
网站建设 2026/6/10 12:00:05

《P2973 [USACO10HOL] Driving Out the Piggies G》

题目描述 奶牛们制造了一种随机臭弹,目的是驱赶小猪。小猪文明由 N(2≤N≤300) 个小猪城市组成,这些城市编号为 1 到 N,通过 M(1≤M≤44,850) 条双向道路连接,具体由它们的不同端点 Aj​ 和 Bj​ 指定 (1≤Aj​≤N;1≤Bj​≤N)。…

作者头像 李华