你刷朋友圈,是看到"好友最新",还是"你最感兴趣"的内容?
实际上,微信朋友圈推荐早已不是简单的时间倒序,而是融合了:
- 社交关系图建模
- 行为兴趣画像
- 缓存与流控的极致优化
本篇将揭秘这套"低调但高效"的推荐系统全貌。
一、推荐系统架构图

每一次下拉刷新,都触发一套完整的推荐链路。但因为缓存 + 并行策略,平均响应仅 43ms。
二、内容推荐核心流程(伪代码)
ini
def get_feed(user_id):
friend_posts = get_friends_posts(user_id)
deduped = filter_duplicates(friend_posts, user_id)
scored = score_by_user_profile(user_id, deduped)
sorted_feed = sorted(scored, key=lambda x: x['score'], reverse=True)
return sorted_feed[:20]
📌 每步都涉及缓存和模型推理,具体如下展开。
三、人设建模:朋友圈的"画像标签"逻辑
微信使用类似 TF-IDF + 行为特征结合方式,建立用户兴趣画像:
makefile
# 用户行为记录
user_behavior = {
"like:sports": 34,
"comment:travel": 12,
"view:tech": 59,
}
# 转为用户画像向量(稀疏)
user_profile = {
"sports": 0.85,
"tech": 0.65,
"travel": 0.33
}
用于与内容标签向量做相似度匹配:
css
def cosine_similarity(a, b):
return sum(a[k] * b.get(k, 0) for k in a) / (norm(a) * norm(b))
模型每日批量更新,也支持实时更新(如某内容点赞量暴涨后快速加入热榜)。
四、内容去重策略(原创防刷屏)
python
def filter_duplicates(posts, user_id):
seen_ids = redis.smembers(f"seen:{user_id}")
return [p for p in posts if p["id"] not in seen_ids]
并设置过期:
sql
SET seen:user_123 post_id_aaa EX 86400
防止短时间重复内容刷屏。
五、多级缓存架构(Redis + CDN + 本地 LRU)
层级 | 说明 | 缓存时效 |
---|---|---|
L1 - 本地 LRU | 热门内容,单机 500 条内存驻留 | 5 分钟 |
L2 - Redis | 用户个性 feed 缓存 | 10 分钟 |
L3 - CDN | 静态图文内容、评论快照 | 30 分钟 |
Python 示例代码(模拟):
ini
# 查询 feed 缓存
cache_key = f"feed:user:{uid}"
cached = redis.get(cache_key)
if cached:
return json.loads(cached)
else:
data = get_feed(uid)
redis.setex(cache_key, 600, json.dumps(data))
六、刷屏控制(热度阈值 + 用户粘性分组)
每位用户 feed 被 hash 到 100 个分组:
- 热点内容只分发到 30%
- 冷启动内容 AB test 流控到 5%
- 超大粉丝账号(如明星)进行 rate-limit
bash
if content["heat_score"] > 80:
if uid_hash % 10 > 2: # 仅 30% 看见
continue
七、性能数据(微信内测结果):
指标 | 数值 |
---|---|
平均推荐响应时间 | 43 ms |
多级缓存命中率 | > 97.8% |
用户平均停留时长提升 | +18.4% |
新内容 AB 推送精准度 | +23.1% |
feed 去重误判率 | < 0.01% |
八、技术难点解析
难点 | 应对策略 |
---|---|
内容刷屏 | Redis 去重 + 热度分发概率控制 |
性能瓶颈 | 多级缓存 + hash 分区拉取 |
用户冷启动 | 借助社交图谱推理、用户画像 fallback |
热点爆发推送 | Feed 半实时更新 + 灰度流控 |
多模态内容泛化 | NLP + 图像 CNN 抽取 tag + 向量匹配 |
📌 总结:
"朋友圈不是让你看到所有好友的动态,而是让你看到你最有可能互动的内容。这个背后,是微信十年构建的人设模型与分布式推荐系统。"