原创

Redis 应该什么时候上

paste-image-1783994121510.png

很多人做产品时,一听到性能优化,就想到 Redis。好像只要系统慢了,加一层 Redis 就能解决问题。

但 Redis 不是性能问题的万能药。它很强,但也会带来新的复杂度:缓存一致性、过期策略、内存成本、故障处理、数据丢失风险、部署维护和调试难度。

对独立开发者来说,问题不是“Redis 好不好”,而是“什么时候值得引入 Redis”。

早期产品通常不需要 Redis

如果你的产品还没有稳定用户,数据库查询也不慢,接口响应正常,流量很小,那么大概率不需要 Redis。

早期更重要的是把数据模型、索引、分页、接口结构和核心流程做好。很多性能问题不是因为没有 Redis,而是因为查询写得差、索引缺失、一次返回太多数据、重复请求太多。

Redis 应该用来解决真实瓶颈,而不是用来制造架构安全感。

在没有明确问题前引入 Redis,只会让系统多一个需要维护的组件。

先优化数据库和查询

在考虑 Redis 之前,先确认数据库本身是否已经做到基本合理。

比如是否有合适索引,是否做了分页,是否避免 N+1 查询,是否减少不必要字段,是否避免在循环中访问数据库,是否把慢查询找出来分析。

很多早期 SaaS 只要补索引、改查询、减少重复请求,就能解决大部分性能问题。

如果数据库查询本来就不合理,直接加 Redis 只是把问题藏起来。等缓存失效或数据量变大,问题还会回来。

适合上 Redis 的第一个场景:热点缓存

Redis 最常见的用途,是缓存经常访问但不经常变化的数据。

比如首页配置、价格方案、权限配置、公共模板、热门文章、统计结果、用户基础信息、第三方 API 返回结果。

这些数据如果每次都查数据库或调用外部服务,会浪费资源,也会拖慢响应。放进 Redis 后,可以显著降低重复查询成本。

但缓存一定要设计过期时间和更新策略。否则用户看到旧数据,问题会很难排查。

第二个场景:会话和登录状态

如果你的系统需要管理大量短期状态,比如登录会话、验证码、一次性 token、临时授权、设备状态,Redis 很适合。

这些数据通常有明确过期时间,不需要永久保存,访问频繁,读写速度要求高。

比如验证码 5 分钟过期,临时登录 token 10 分钟过期,某个导入任务状态 1 小时后清理。这些场景用 Redis 比放在主数据库里更自然。

注意:关键业务数据不要只放 Redis。Redis 适合短期状态,不适合当唯一事实来源。

第三个场景:限流和防刷

当你的接口开始被频繁请求,或者需要防止恶意刷接口、刷登录、刷验证码、刷 AI 调用时,Redis 很适合做限流。

限流需要快速记录某个用户、IP、设备或 API Key 在一段时间内请求了多少次。Redis 的过期键和计数能力非常适合这类场景。

比如每个 IP 每分钟最多请求 60 次,每个用户每天最多生成 100 次,每个邮箱 10 分钟内最多发送 3 次验证码。

这类限制如果只靠数据库,会增加写入压力;如果没有限制,又容易被滥用。

第四个场景:队列和后台任务

很多 SaaS 都会出现不能在用户请求里同步完成的任务。

比如发送邮件、生成报表、处理上传文件、调用 AI、同步第三方数据、批量导入、图片处理、通知推送。

这些任务如果放在用户请求里执行,会让接口等待太久,也容易因为超时失败。

Redis 可以作为轻量队列的基础,配合任务处理器,把耗时任务放到后台慢慢执行。用户请求只负责提交任务和返回状态。

但如果任务非常关键、量很大、需要复杂重试和审计,后面可能需要更专业的队列系统。

第五个场景:实时状态和排行榜

Redis 也适合处理一些变化快、读取频繁、允许短期存储的数据。

比如在线用户状态、实时计数、排行榜、房间状态、协作光标、短期活动统计。

这些数据如果全部写主数据库,会产生大量写入压力;但如果只需要短期存在或可重建,Redis 会很合适。

不过要分清楚:哪些数据丢了可以重建,哪些数据必须永久保存。不能把重要业务结果只存在 Redis 里。

Redis 不应该解决哪些问题

Redis 不适合用来掩盖糟糕的数据模型,也不适合替代主数据库。

如果你的表结构混乱、索引缺失、权限设计错误、接口重复请求太多、前端无限刷新,Redis 只能暂时缓解,不会根治。

Redis 也不适合作为订单、支付、用户资产、关键业务记录的唯一存储。它可以参与流程,但最终事实应该落到可靠的持久化数据库里。

不要把 Redis 当成“性能胶水”。它是一种工具,不是架构补丁。

引入 Redis 前要问的几个问题

你可以用下面清单判断是否真的需要 Redis:

是否已经确认真实瓶颈?
数据库索引和查询是否已经优化?
是否存在高频读取的热点数据?
是否存在大量短期状态?
是否需要限流或防刷?
是否有耗时任务需要后台执行?
Redis 数据丢失是否可接受?
是否设计了过期和更新策略?
是否有人能维护和排查 Redis?

如果大部分答案都是“不确定”,先不要急着上。

一个稳妥的引入顺序

对独立开发者来说,可以按这个顺序引入 Redis:

第一步:先不用 Redis,优化数据库、索引和接口
第二步:出现热点读取后,用 Redis 做缓存
第三步:需要验证码、临时 token、限流时,用 Redis 做短期状态
第四步:出现耗时任务时,用 Redis 队列或任务系统
第五步:需要实时状态、排行榜、协作状态时,再扩展使用

这样做的好处是,每一步都有明确问题和收益,而不是为了架构好看而增加复杂度。

写在最后

Redis 很有用,但不应该太早成为系统标配。

早期 SaaS 更应该先把关系型数据库用好,把查询写好,把索引建好,把业务流程跑顺。等出现明确的热点、短期状态、限流、队列或实时需求,再引入 Redis。

好的技术引入,不是“我可能会需要”,而是“我现在有一个明确问题,它刚好适合解决”。

下一篇,我们继续聊接口设计:第一个接口怎么设计

正文到此结束
Loading...