朋友圈点赞功能实现方案
1. 核心数据结构设计
(1) 数据库表结构(以MySQL为例)
-- 动态表 (存储朋友圈内容)
CREATE TABLE posts (
post_id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '发布者ID',
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 点赞关系表
CREATE TABLE likes (
like_id BIGINT PRIMARY KEY AUTO_INCREMENT,
post_id BIGINT NOT NULL COMMENT '关联动态ID',
user_id BIGINT NOT NULL COMMENT '点赞用户ID',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uniq_post_user (post_id, user_id) -- 防止重复点赞
);
(2) Redis缓存设计
- 点赞计数器:
hash:post_likes_count {post_id: count}
- 用户点赞状态:
set:post:{post_id}:liked_users [user_ids]
2. 服务端接口设计
(1) 点赞/取消赞接口
POST /api/posts/{post_id}/like
请求参数:
{
"action": "like/unlike" // 操作类型
}
(2) 获取点赞列表接口
GET /api/posts/{post_id}/likes?page=1&size=20
3. 关键业务流程
(1) 点赞操作
(2) 取消赞操作
4. 技术实现要点
(1) 双写一致性保障
- 最终一致性策略:
- 优先操作Redis
- 异步队列同步到MySQL
- 定时任务补偿差异数据
(2) 高频访问优化
- 读写分离:读操作直接访问Redis
- 批量合并写入:每10秒将Redis计数批量更新到MySQL
- 布隆过滤器:快速判断用户是否已点赞
(3) 防刷机制
- 滑动窗口限流:每个用户每分钟最多操作50次
- 设备指纹校验:识别异常设备
- 敏感操作风控:大额点赞触发验证码
5. 客户端实现方案
(1) 点赞动画交互
// React示例
const LikeButton = ({ postId }) => {
const [isLiked, setIsLiked] = useState(false);
const handleLike = async () => {
try {
await api.post(`/posts/${postId}/like`, {
action: isLiked ? 'unlike' : 'like'
});
setIsLiked(!isLiked);
} catch (error) {
showToast('操作失败');
}
};
return (
<HeartIcon
filled={isLiked}
onClick={handleLike}
className="animate-bounce-on-click"
/>
);
};
(2) 实时更新策略
- WebSocket推送:当点赞数变化时广播消息
socket.on('like_update', (data) => { if (data.postId === currentPostId) { updateLikeCount(data.count); } });
6. 性能压测指标参考
场景 | QPS 要求 | 响应时间 | 容错率 |
---|---|---|---|
点赞高峰 | 10万+ | <200ms | 0.1% |
点赞列表查询 | 5万+ | <100ms | 0.01% |
数据同步延迟 | - | <5s | - |
7. 异常处理方案
- Redis宕机降级:直接读写MySQL,启动临时计数器
- 重复请求过滤:客户端防抖 + 服务端幂等校验
- 数据不一致修复:每日凌晨执行修复脚本
-- 校准Redis与MySQL数据 UPDATE posts p SET p.like_count = ( SELECT COUNT(*) FROM likes l WHERE l.post_id = p.post_id );
总结
朋友圈点赞功能通过「内存缓存+异步持久化」架构实现高并发处理,结合防刷策略保障系统安全,利用动画反馈提升用户体验。关键技术点在于平衡数据一致性与系统性能,建议采用分级存储策略,核心数据走强一致性通道,辅助数据使用最终一致性方案。