计数器系统设计方案对比
点赞数、阅读量、粉丝数——这些计数器是社交系统的血液。如何设计一个高性能、高可靠的计数器系统?
一、计数器的业务场景
- 1.1 点赞数——每次点赞 +1
- 1.2 阅读量——每次访问 +1(去重?)
- 1.3 粉丝数——关注/取关 +1/-1
- 1.4 业务特点——写多读少,允许一定延迟
二、MySQL 自增的局限
- 2.1 热行竞争——行锁成为瓶颈
- 2.2 UPDATE 的 TPS 上限
三、Redis Hash 方案
- 3.1 一个 Hash 存储多条记录的计数——
HINCRBY counter:post:{id} likes 1 - 3.2 优点——内存操作、原子性
- 3.3 持久化——定时刷回 MySQL
- 3.4 缺点——Redis 内存成本
四、Redis 分槽计数器
- 4.1 原理——将一个计数拆成 N 个槽
- 4.2 写操作——
HINCRBY counter:post:{id}:{random_slot} count 1 - 4.3 读操作——
HGETALL后 SUM - 4.4 优点——热点分散,无锁竞争
- 4.5 槽数设计——16/32/64
五、异步 + 批量写入
- 5.1 本地缓存计数——先累加在内存
- 5.2 定时批量刷入 Redis/MySQL——每秒一次
- 5.3 风险——进程重启丢失少量计数
六、容错与降级
- 6.1 Redis 不可用时——MQ 缓冲 + 异步重试
- 6.2 数据一致性——定时对账
- 6.3 最终一致性——允许短时间内的数值偏差
七、总结
- 计数器设计 = 分散热点 + 异步批量 + 最终一致
- Redis 分槽计数器是性价比最高的方案
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!