OBJECT FREQ 是什么
OBJECT FREQ 是 Redis 4.0 起的对象自省命令,返回键在 LFU 策略下累计的访问频率计数。这个计数是 8 位对数刻度(0-255),不是真实访问次数:每次访问按 1/(count*lfu-log-factor+1) 的概率递增,访问越多增长越慢,所以用一个字节就能区分冷键和热点键。它只在 maxmemory-policy 为 LFU 系(allkeys-lfu、volatile-lfu)时才有意义,LRU 系策略下执行会直接报错。
基本信息
| 命令 | OBJECT FREQ key |
|---|---|
| 版本 | Redis 4.0 及以上 |
| 前提 | maxmemory-policy 为 allkeys-lfu 或 volatile-lfu |
| 返回 | 0-255 的对数频率计数 |
| 相关调节 | lfu-log-factor(默认 10)、lfu-decay-time(默认 1 分钟) |
| 开销 | O(1),但要对大量键调用时仍需控制频率 |
典型使用场景
- 验证热点判断:业务认定的热点键,看计数是否真的排在前列
- 校验 LFU 参数:调整 lfu-log-factor 或 lfu-decay-time 后确认计数曲线符合预期
- 排查命中率下降:缓存命中率掉了,抽查计数是否普遍偏低,说明淘汰误伤有用键
- 容量优化排序:结合 MEMORY USAGE 找出又大又热的键优先拆分
- 自动化巡检:脚本按前缀抽样,把计数写进监控做趋势
最小示例
最小示例
redis-cli CONFIG GET maxmemory-policy # 先确认是 LFU 策略,否则命令会报错
redis-cli OBJECT FREQ user:1001 # 读当前对数频率计数(0-255)
redis-cli GET user:1001 # 访问一次,计数按概率递增
redis-cli OBJECT FREQ user:1001 # 复查计数,通常只增 0 或 1
redis-cli OBJECT IDLETIME user:1001 # LFU 下这条会报错,可用来反证策略已生效返回与解读
| 情形 | 返回值 | 怎么解读 |
|---|---|---|
| LFU 下被频繁访问的键 | 计数通常在数十以上 | 确认是热点,重点优化其体积与访问方式 |
| LFU 下的冷键 | 0 或个位数 | 可考虑加 TTL 让淘汰更早回收 |
| LRU 策略下 | 返回错误:需要 LFU 策略 | 先切策略再看,切换后计数需要时间累积 |
| 键不存在 | 返回空(nil) | 核对键名与所选数据库 |
计数只在同一实例、同一 lfu-log-factor 下可比。换实例或改过参数后,数值刻度已经变了,跨环境比大小没有意义。
运行时从 LRU 切到 LFU,旧键的计数是随机初值,需要跑一段时间再采样,否则结论不可用。