2024年Q3,某东南亚金融科技公司把用户账户全迁进Redis集群。6个月后,他们在技术复盘会上算了一笔账:存储成本暴涨1470%,冷启动时数据丢失导致37万用户无法登录——而最初只是想"让查询快一点"。
这不是孤例。GitHub上有个 starred 2.3k 的仓库叫"redis-as-primary-db",README 写着"生产环境已验证"。但点进 issues,第一条就是:"我们丢了6小时交易数据,怎么恢复?"
缓存比数据库快,这是常识。但"快"的代价是什么?当 Redis 摘掉"易失性"的帽子,它真能顶替数据库吗?
成本陷阱:15倍价差是怎么算出来的
用 AWS 公开定价做个沙盘推演。假设你有100万月活用户,每人每天产生10次读写操作。
DynamoDB 的账单长这样:每百万次读取0.125美元,写入0.625美元,存储每GB每月0.25美元。按这个模型跑一年,总成本约1000美元出头。
换成 Redis 集群呢?需要2个分片、每分片1个副本、共4个节点。按 r6g.xlarge 实例算,时价1.729美元,一年下来15147美元。
15倍的差距,还不包括运维人力和快照存储的隐性成本。
有人可能会说:Redis 不按请求计费,流量暴涨时成本不会线性增长。这没错——但前提是你的业务是读多写少的理想模型。一旦写入比例超过30%,Redis 的持久化开销(AOF重写、RDB快照)会让 CPU 使用率曲线变得很难看。
那家东南亚公司的 CTO 在复盘文档里写了一句:"我们当时觉得'快'值这个价,但没算清楚'永远快'要付多少订阅费。"
易失性悖论:你消灭了 volatility,却制造了更大的风险
Redis 的原始设计建立在 RAM 之上。断电即清空,这是特性不是 bug。想让它"像数据库一样可靠",业界标准做法是快照(RDB)+ 复制(Replication)。
但这里有个微妙的认知偏差:非易失化改造解决的是"数据会不会丢",不是"数据什么时候丢"。
Redis 的内存淘汰机制(LRU)就是典型案例。当内存吃紧,系统会删除"最近最少使用"的数据。如果 Redis 是你的唯一数据源,这意味着:用户B三个月没登录,他的账户信息可能被无声蒸发。
那位 CTO 的团队遇到过更隐蔽的场景。他们的风控模型依赖用户历史行为序列,这些序列被当作"低优先级缓存"处理。结果大促期间内存吃紧,凌晨2点 LRU 触发,早上8点风控系统开始批量误杀正常交易。
他们花了72小时才定位问题——因为 Redis 的淘汰是静默的,没有告警,只有结果。
有人提议:关掉淘汰策略,无限扩容内存不就行了?技术上可行。AWS 最大的 Redis 实例支持1.5TB内存,年租金六位数起步。但这就进入了那个经典的工程陷阱:用工具的错误用法,去证明工具不能用。
边界测试:什么时候 Redis 真能当数据库
并非所有场景都谈"色变"。Redis 官方文档里藏着几个被低估的持久化配置:
appendfsync always 模式每次写入都刷盘,性能暴跌但数据最安全;appendfsync everysec 是默认平衡态;appendfsync no 则完全交给操作系统调度。大部分"Redis丢数据"的事故,根源是用了 no 或 everysec 却假设自己有 always 的可靠性。
2023年,某头部券商的实时持仓系统尝试过一条中间路线:Redis 主集群+ 同步写入 TiDB,读走 Redis、写双落盘。架构复杂度翻倍,但P99延迟从12ms压到1.8ms。他们的 SRE 负责人后来分享:"这不是用 Redis 代替数据库,是用 Redis 重新定义了'数据库'的接口边界。"
更极端的案例来自游戏行业。某 MMO 的实时对战状态服务用 Redis 做主存储,但设计了两层保险:单局游戏数据TTL设为15分钟,结算后立即归档到 S3;同时每个操作写一条预写日志(WAL)到 Kafka。这套架构支撑了200万并发,但代码里光是数据一致性校验就占了40%行数。
他们的技术债清单第一条写着:"如果当初直接上 ScyllaDB,现在团队能少加班30%。"
工具理性:快不是目的,是权衡后的副产品
回到最初的问题:为什么不用缓存存一切?
答案藏在两个被混淆的概念里。缓存的"快"来自内存访问和简单的数据结构,代价是容量受限和一致性宽松;数据库的"慢"来自磁盘IO和复杂查询优化,换来的是容量弹性、事务隔离和schema演进能力。
当你试图把缓存改造成数据库,本质上是在用后者的成本结构,去逼近前者的性能指标。这不是技术选型,是数学上的不可能三角。
那位东南亚 CTO 在复盘最后贴了一张截图:他们最终迁回 DynamoDB,但保留了一层 Redis 做热数据加速。新架构的年度成本比纯 Redis 方案低82%,P99读延迟3.2ms——比最初的纯缓存方案慢1.4ms,但没人再凌晨被叫醒处理数据丢失。
截图下方有一条工程师的评论,被点赞置顶:"我们花了1500万学费,终于学会了一件事:Redis 是最好的缓存,也是最贵的主数据库。"
如果让你设计一个从零开始的支付系统,你会把用户余额放在 Redis 还是关系型数据库?延迟要求和一致性要求,哪个会先被写进技术规格书?
热门跟贴