💡 实战经验
KEYS 命令是核弹
KEYS * 会遍历整个数据库的所有 key,在百万级 key 的实例上跑一次可能导致整个 Redis 卡死几秒——所有客户端超时。生产环境用 SCAN 代替,它是游标迭代,不会阻塞。
用 used_memory_rss 不要用 used_memory
used_memory 只是 Redis 自己统计的逻辑内存,used_memory_rss 才是操作系统实际分配的物理内存。两者差距大说明有内存碎片。监控用 rss,告警阈值要按 rss 设。
大 key 是万恶之源
一个 String 类型的 value 存了 100MB 的 JSON,一个 Hash 里塞了 100 万个 field——这就是大 key。大 key 会导致:删除时阻塞(DEL 大 key 卡几秒)、同步到从节点时阻塞、内存不均匀(Cluster 模式下某个节点特别胖)。用 redis-cli --bigkeys 定期扫描。
expire 别设太精确
给 100 万个 key 都设了 3600 秒过期,结果在某一秒它们同时过期,Redis 瞬间处理百万次删除请求——CPU 飙到 100%。解决办法:过期时间加一个随机偏移量 EXPIRE key (3600 + RANDOM(0,600))。