删 Redis 之后,系统反而更快了?Postgres 18 给了我底气

我把一整套 Redis 集群关掉了。
没人发现。
没有告警。
Slack 没人吵架。
延迟曲线:无波动。
我按下回车,看着监控图轻轻晃了一下,然后——
下降了。
那一刻我悟了: Postgres 18,干得比我维护多年的整个缓存层还稳。
下面,是这件事的来龙去脉、Postgres 18 到底带来了什么改变、以及你什么时候也可以放心删掉缓存 tier 而不会把 p95 弄炸。
Redis 嚎叫得比用户还大声的那一夜多年间,我们的架构长这样(互联网“严肃架构图”的标准模板):
Clients|v+---------+ +--------+| API +------->| Redis |+---------+ +--------+| |v v+---------------+| PostgreSQL |+---------------+
读流程:
1. 查 Redis
2. 缓存 miss → 查 Postgres
3. 回写 Redis
我们觉得这才叫“专业”。
TTL 也调了。Eviction policy 也玩转了。
甚至还做过“缓存策略”的分享。
但某次大促晚上,Redis 爆炸了。
CPU 90%
网络顶满
延迟乱蹦,但数据库完全没事,像在喝咖啡
我们扩 Redis、调内存、调驱逐策略
Postgres 全程无感:无聊得很
那次我第一次怀疑:“是不是哪里不对劲。”
我们花钱、花精力搭了个缓存层,结果它成了瓶颈。
Postgres 18 到底改变了什么?在 18 版之前,我脑子里有条不成文规则:
“数据库必须保护,必须用缓存挡着。”
但 Postgres 18,让我第一次觉得:
也许数据库本身就能抗住。
它带来了 3 个对我们至关重要的升级:
1. 全新异步 I/O 子系统Postgres 能自动 批量、合并多个读取请求 ,顺序扫描和位图堆扫描速度最高提升 3 倍 。
2. 更聪明的索引使用(包括多列跳跃扫描 Skip Scan)
以前一些多列索引明明建了,优化器总是不听话。 现在终于“按你意愿”走了对的索引路径。
3. 虚拟生成列(Virtual Generated Columns)
可以把一些“派生字段”直接放数据库里,读请求更快、更简单,不再需要 cache fill。
这三点结合,让我们冒出一个危险又诱人的想法:
“如果数据库本身就够快,那还要 Redis 干嘛?”
改变我人生架构观的一次实验我没有直接删 Redis。 我做的是“暗流量测试”(dark launch)。
我们挑了一个最恼人的缓存相关查询:
接口 :用户仪表盘 dashboard
行为模式 :用户每天会点好几次
旧逻辑 :查用户资料 → 查订单 → 查状态 → 聚合 → 丢 Redis
我们先在 Postgres 18 上优化了查询。
加了多列索引 + 用 skip scan CREATEINDEX CONCURRENTLY idx_orders_customer_status_date ONorders(customer_id, status, created_at DESC);-- 简化的 Dashboard 查询SELECTo.id,o.total_amount,o.status,o.created_atFROMorders oWHEREo.customer_id =$1 ANDo.status IN('PAID', 'SHIPPED')ORDER BYo.created_at DESCLIMIT 20;
在 Postgres 18 之前,优化器总是给出一种“不咸不淡”的执行计划。 18 之后,它终于懂了“你想干嘛”。
然后我们在 staging 上打开 async I/O,把一小部分流量直接绕过 Redis 打到 Postgres。
压测配置:1000 并发用户
90% 读、10% 写
1500 万订单
200 万用户
结果如下:模式
p95 延迟
Cache 命中率
备注
Redis + Postgres
72 ms
91%
偶发缓存风暴
Postgres 18 only
54 ms
100%
无外部缓存
最让我震惊的不是平均值,而是:
纯 Postgres 比 “带缓存” 的架构,还更快。
这一刻我心里蹦出的不是“数据库行不行”, 而是:
“我们这个 Redis 缓存层到底还要不要留?”
架构回归简单那一天我们不是一口气删掉 Redis,而是一段段路由迁移。
最终架构长这样:
Clients|v+---------+| API |+---------+|v+---------------+| PostgreSQL |+---------------+
在 Postgres 里,我们用到了以前版本没有的能力:
虚拟生成列:让“读侧逻辑”简单到只跑一个 SELECT,不需要“查询 → 计算 → 写缓存”。
CREATE TABLEinvoices (id BIGSERIAL PRIMARY KEY,customer_id BIGINT NOT ,amount_cents BIGINT NOT ,tax_rate NUMERIC(4,2) NOT ,total_cents BIGINTGENERATED ALWAYS AS(ROUND(amount_cents *(1 +tax_rate))));
Dashboard 直接读 total_cents ,连缓存都不需要。
Postgres 18 的 JSON_TABLE 让我们避免了额外的“cache-backed projection layer”。
当我们确认负载稳定后,我们做了一件又刺激又愉悦的事:
把仪表盘流量从 Redis 切掉上生产。
图表变化:Redis QPS 掉到零
数据库 read I/O 稍升,但 CPU 依然轻松
用户延迟变得更稳定、更低
没有火警。
没有宕机。
没有谁骂我们。
剩下的问题只有一个:
“我们还能在哪些地方这么干?”
什么时候你绝对不该删缓存层我不会忽悠你说“大家都可以删 Redis”。
以下情况 Redis 依然有不可替代性:
激烈波动的读流量(spiky traffic)就算 async I/O 也兜不住盘 IO。
高写入、全局计数、热点行Redis 在计数器、排行榜方面仍然 unbeatable。
跨服务共享缓存如果 DB 不是单一事实来源,Redis 很好用。
你的 DB 重启会让业务暴毙那缓存层还是必要的安全带。
这篇文章不是“Redis 已死”。
真正的观点是:
别再因为“教程里都这么画”就盲目上 Redis。
Postgres 18 很可能已经够你用了。
对你的意义(作为后端工程师)最大的收获不是更低的延迟,而是:
思维方式的升级单一事实来源
更少的事故组件
更少“过期/脏数据”藏身的地方
这对你的职业发展意味着:
你不是那个看到架构图就机械加 Redis 的工程师, 你是那个能判断“数据库能否扛起全部负载”的工程师。
Postgres 18 给了我们工具。
真正的“删缓存,是不是合理”,
永远是你基于真实流量、真实压测和工程判断后的选择。
这种决定比你跑什么版本的 Redis 更让人记住。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
