网站点赞功能表面看是一个简单的计数器递增操作,深层逻辑则是高并发场景下的写密集型系统设计挑战。从业务维度考量,点赞不仅是用户对内容的即时反馈,更是构建内容推荐算法权重、衡量内容热度的核心指标。技术实现上,直接操作数据库进行持久化存储在流量洪峰下极易导致锁竞争和 IO 瓶颈,因此引入内存数据库做读写分离与异步持久化是行业通用的标准范式。
系统设计需遵循 CAP 理论中的 AP(可用性与分区容错性)优先原则,在极短时间内允许数据展示的最终一致性,以换取系统的高吞吐量。核心痛点在于如何在海量用户同时点击时,保证计数准确、防止重复点赞,并确保数据不丢失。
构建高可用点赞系统,通常采用分层架构设计,涵盖客户端、网关层、应用服务层、缓存层及持久层。
1. 持久层模型设计
关系型数据库(如 MySQL)负责数据的最终落地。设计两张核心表:一张用于记录点赞明细,确保用户与内容的关联关系唯一;另一张用于记录内容的聚合点赞数,便于快速查询。明细表需建立联合唯一索引,防止同一用户对同一内容重复产生脏数据。
2. 缓存层数据结构
Redis 是构建缓存层的首选工具,利用其原子操作特性解决并发问题。推荐使用以下两种数据结构组合:
针对超大规模内容(如千万级帖子),Set 结构内存消耗过高,可采用 Bloom Filter(布隆过滤器) 辅助判断用户是否点赞,虽存在极低概率误判,但能大幅节省内存。
实施点赞功能需严格按照标准流程进行,确保逻辑闭环与数据安全。
步骤 1:前端防抖与接口幂等性设计
前端在用户点击点赞按钮时,应立即通过 CSS 样式给予视觉反馈,并设置 500ms - 1000ms 的防抖锁,防止用户因快速多次点击发起重复请求。后端接口设计必须遵循幂等性原则,利用 Redis 的 Set 集合特性或数据库的唯一索引约束,确保同一用户在同一时刻的多次请求只产生一次有效变更。
步骤 2:缓存层原子操作处理
后端服务接收请求后,直接与 Redis 交互。执行逻辑如下:
```bash 伪代码示例:点赞操作 if SISMEMBER content:like:users:1001 user_88: 已点赞,执行取消 SREM content:like:users:1001 user_88 DECR content:like:count:1001 else: 未点赞,执行点赞 SADD content:like:users:1001 user_88 INCR content:like:count:1001 ```上述操作利用 Redis 的单线程模型特性,天然保证了并发场景下的原子性,无需加分布式锁。
步骤 3:异步持久化策略落地
为了降低数据库压力,Redis 中的数据变更不应实时同步到 MySQL。采用 Write-Behind(异步写回) 策略,通过消息队列(如 Kafka、RabbitMQ)或定时任务将缓存中的变更数据批量刷入数据库。例如,每 5 分钟或当变更积压达到 1000 条时,触发一次批量 Merge 操作。这要求业务能够容忍短时间内的数据不一致。

步骤 4:数据一致性校验与补偿
在低峰期(如凌晨)运行核对脚本,比对 Redis 中的计数与 MySQL 中的聚合数据。若发现偏差,以 Redis 数据为准(因为它是最新最全的交互记录)修正 MySQL 数据,确保最终一致性。
面对突发流量或热门事件引发的“热点点赞”,需采取针对性优化手段。
1. 热点 Key 处理
当某条内容成为全网热点时,大量请求会集中打向同一个 Redis Key,导致单节点负载过高。解决方案是进行 本地缓存:在应用服务器(JVM/本地内存)中缓存热点内容的点赞状态和计数,请求优先在本地处理,定期再与 Redis 同步。或者将热点 Key 分片,将请求分散到多个 Redis 节点上计算,最后合并结果。
2. 分离读与写逻辑
展示点赞数时,优先读取 Redis 中的 String 计数;展示用户是否点赞时,优先读取 Redis 中的 Set 或 Bloom Filter。仅在缓存未命中时才回源查询 MySQL,并且回源后需将数据“写回”缓存。严禁在读取链路中直接操作数据库。
点赞数据直接影响内容推荐权重,必须具备完善的反刷量机制。
1. 频率限制
基于用户 ID 和 IP 维度进行限流。利用 Redis 的 INCR 命令配合过期时间,限制单个用户在 1 秒内只能发起 1 次点赞请求,或单 IP 在 1 分钟内请求次数不超过阈值。超限请求直接拦截并返回 HTTP 429 状态码。
2. 行为分析与黑名单
构建风控规则引擎,识别异常行为模式,如:短时间内对大量不同内容点赞、点赞时间间隔呈现严格的机器特征等。识别出的异常账号自动加入黑名单,禁止其参与点赞计数更新。
建立全方位的监控体系是保障系统稳定运行的基石。
1. 核心监控指标
2. 典型问题排查思路
遇到“点赞数显示不准”问题时,排查顺序如下:检查前端是否做了乐观 UI 更新但接口失败 -> 检查 Redis Key 是否被误删或过期 -> 检查异步同步任务是否阻塞 -> 检查数据库唯一索引冲突日志。遇到“响应超时”时,重点排查 Redis 连接池是否耗尽及是否出现热点 Key 竞争。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图