删 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 ,连缓存都不需要。

更强的 JSON 支持

  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 更让人记住。