Redis 说键已经没了,内存却在 22 秒后才回来
来源:dev.to — 2026-10-02
📋 概述
带 TTL 的键在过期瞬间就「不存在」了:GET 返回 nil、EXISTS 返回 0,对应用而言它已经消失。作者想弄清的是内存何时才真正释放,因为这两件事并不是同一个事件。在空闲服务器上让五百万个键同时过期,答案略低于 23 秒——在这段时间里 Redis 一直为这些「所有客户端都认定不存在」的数据占用着数百 MB 内存。更出乎意料的是:繁忙的 Redis 清理速度比空闲时快四倍以上。作者还提醒,如果键的过期时间被分散开,这个问题根本不会出现,必须给所有键同一个绝对截止时间才能复现——这正是整点汇总缓存或按天批量导入的典型形态。
🔑 核心要点
- 五百万键同时过期时,DBSIZE 在过期瞬间仍报告约 498 万个键,并持续下降约 23 秒。
- 过期瞬间 额外占用约 810 MB 内存,直到 t+22.8 秒 dbsize 才归零。
- 繁忙的 Redis 比空闲的清理速度快四倍以上,与作者最初的直觉相反。
- 问题只在所有键共享同一绝对过期时刻时出现,如整点汇总缓存或按天批量导入。
💡 金句
键消失和内存回来,不是同一个事件——我只是想知道中间差了多久。
👍 0
👎 0
← 返回 dev.to 首页