高并发优化

Redis 计数能显著提升性能,但热门内容仍然会制造局部热点。假设一条视频在直播间或首页被推荐,短时间内涌入几十万次点赞请求,单个 Redis key、单个服务实例、单条回写链路都可能成为瓶颈。

本章主线

本章讨论高并发下的削峰和扩展:

  1. 本地缓存:读请求不必每次都打到 Redis,降低读放大。
  2. 分片计数:把一个热点计数拆成多个 shard,减少单 key 压力。
  3. 合并写:把大量增量聚合后批量回写数据库。

这些方案都在做同一件事:把瞬时压力拆散、聚合或延后。

读写分离

点赞系统有两类请求:

  • 写:点赞、取消点赞。
  • 读:展示点赞数、判断当前用户是否已点赞。

展示点赞数可以使用缓存或近似值,不必每次查最精确数字。用户是否点赞过则需要更准确,因为它影响按钮状态和幂等处理。

分片计数的取舍

分片计数可以把:

like_count:article_1

拆成:

like_count:article_1:shard_0
like_count:article_1:shard_1
...

写入时随机或按用户路由到某个分片,读取时汇总多个分片。这样写压力降低,但读取成本变高,且需要处理汇总缓存。

合并写的边界

合并写能减少数据库压力,但会带来延迟。如果 Redis 已经加了 1000,数据库还没回写,后台报表可能看到旧值。是否可接受取决于场景:

  • 用户前台展示可以读 Redis。
  • 后台统计可以接受延迟。
  • 财务或结算类计数不应使用这种弱一致方案。

本章学完后,你应该能根据热点程度选择本地缓存、分片计数和合并写,而不是盲目堆缓存。

章节