点赞数、阅读量、粉丝数——这些计数器是社交系统的血液。如何设计一个高性能、高可靠的计数器系统?

一、计数器的业务场景

  • 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 分槽计数器是性价比最高的方案