朋友圈点赞功能实现方案


朋友圈点赞功能实现方案

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) 点赞操作
Client API Redis MySQL POST /posts/123/like (action=like) SADD post:123:liked_users 456 1 (新增成功) HINCRBY post_likes_count 123 1 INSERT IGNORE INTO likes(...) 成功 200 OK Client API Redis MySQL
(2) 取消赞操作
Client API Redis MySQL POST /posts/123/like (action=unlike) SREM post:123:liked_users 456 1 (移除成功) HINCRBY post_likes_count 123 -1 DELETE FROM likes WHERE post_id=123 AND user_id=456 成功 200 OK Client API Redis MySQL

4. 技术实现要点

(1) 双写一致性保障
  • 最终一致性策略
    1. 优先操作Redis
    2. 异步队列同步到MySQL
    3. 定时任务补偿差异数据
(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万+<200ms0.1%
点赞列表查询5万+<100ms0.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
    );
    

总结

朋友圈点赞功能通过「内存缓存+异步持久化」架构实现高并发处理,结合防刷策略保障系统安全,利用动画反馈提升用户体验。关键技术点在于平衡数据一致性与系统性能,建议采用分级存储策略,核心数据走强一致性通道,辅助数据使用最终一致性方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值