点赞记录

存储挑战

实现 Feed 流后,数据量快速增长。

数据增长:

第 1 周:
- 用户数:1,000
- 点赞总数:10,000
- 平均每用户:10 条点赞记录

第 4 周:
- 用户数:10,000
- 点赞总数:500,000
- 平均每用户:50 条点赞记录

第 12 周:
- 用户数:50,000
- 点赞总数:5,000,000
- 平均每用户:100 条点赞记录

问题:
- 存储成本快速增长
- 查询性能下降
- Redis 内存压力大

需要优化存储方案。

存储方案对比

方案 1:全量存储

优点:

  • 实现简单
  • 数据完整

缺点:

  • 存储成本高
  • 内存占用大

存储成本估算:

假设:
- 用户数:50,000
- 平均每用户:100 条点赞记录
- 每条记录:16 字节(article_id: 8 bytes + score: 8 bytes)

总存储:
50,000 × 100 × 16 = 80 MB

如果增长到:
- 用户数:500,000
- 平均每用户:200 条

总存储:
500,000 × 200 × 16 = 1.6 GB

方案 2:限制存储

优点:

  • 存储成本可控
  • 内存占用稳定

缺点:

  • 旧数据会丢失
  • 不支持查看历史记录

适用场景:

  • 只需要最近的记录
  • 不需要完整历史

方案 3:分层存储(推荐)

优点:

  • 存储成本优化
  • 查询性能好(热数据)
  • 支持历史查询(数据库)

缺点:

  • 实现复杂
  • 需要多层存储

存储成本对比:

全量存储:
- Redis:1.6 GB
- 数据库:5 GB

限制存储:
- Redis:200 MB
- 数据库:5 GB
- 节省:87.5%

分层存储:
- Redis(热):50 MB
- Redis(温):100 MB
- 数据库:5 GB
- 节省:90.6%

数据迁移

从数据库迁移到 Redis

增量同步

性能优化

优化 1:压缩存储

优化 2:Bitmap 存储

Bitmap 优缺点:

优点:
- 存储空间极小(每个用户只占 1 bit)
- 查询速度快
- 适合布尔值(点赞/未点赞)

缺点:
- 不支持时间排序
- 不适合稀疏数据
- 文章 ID 必须连续

课后练习

练习 1

如何实现点赞记录的”软删除”?

参考答案(3 个标签)
数据存储软删除设计模式

方案:添加删除标记

练习 2

如何实现点赞记录的”归档”?

参考答案(3 个标签)
数据归档存储优化生命周期

方案:自动归档旧数据

练习 3

如何实现点赞记录的”统计分析”?

参考答案(3 个标签)
数据分析统计聚合

方案:定期统计

练习 4

如何实现”批量导入”点赞记录?

参考答案(3 个标签)
数据导入批量操作性能

方案:使用 Pipeline 批量导入

练习 5

如何实现”跨天”的点赞记录查询?

参考答案(3 个标签)
数据查询时间范围分片

方案:按日期分片存储

思考题

  1. 如何设计一个支持”撤销”的点赞系统(可以撤销任意时间的点赞)?

  2. 如何实现”点赞提醒”(文章作者收到点赞通知)?

  3. 如何优化”超级用户”的 Feed 流存储(点赞数超过 10000)?

💡 提示:这些问题没有标准答案,建议结合实际情况深入思考。