RANDOMKEY 是什么
RANDOMKEY 从当前库中随机返回一个键名,不删除键,复杂度 O(1);库为空时返回 nil。它适合做键空间抽样巡检,比如随机取一批键检查是否有异常值、异常长度或缺少预期 TTL。要注意它是「随机取一个存在的键」,不是「均匀抽样分布」:不同数据结构的分布并不均等,用它统计键数量或推断数据分布都会得到偏差结论。
基本信息
| 语法 | RANDOMKEY |
|---|---|
| 返回 | 随机键名;库为空时返回 nil |
| 复杂度 | O(1) |
| 适用库 | 当前选中库(SELECT 决定) |
| 不适用 | 统计键数量、推断分布、随机取有内容的业务键 |
典型使用场景
- 键空间抽样:随机取若干键检查值与 TTL 是否符合规范
- 异常值排查:抽样检查是否有超长字符串或异常编码的键
- 容量评估辅助:结合 TTL 与类型统计抽样结果估算整体情况
- 临时验证:确认写入的数据是否真的落在预期的库中
- 演练与演示:需要演示键结构时快速取一个样本
抽样与巡检
抽样与巡检
SET a 1
SET b 2
SET c 3
RANDOMKEY # 随机返回其中一个键名,不删除键
# 抽样巡检:连续取 100 次,去重后逐个检查类型与 TTL
for i in $(seq 1 100); do redis-cli RANDOMKEY; done | sort -u | head -20
# 对抽到的键做进一步检查(示例)
redis-cli TYPE a
redis-cli TTL a
redis-cli MEMORY USAGE a用途判断
| 需求 | 是否适用 | 替代方案 |
|---|---|---|
| 随机取一个键名 | 适用 | — |
| 统计键数量 | 不适用 | DBSIZE(当前库)或 INFO keyspace(各库) |
| 随机取业务有效键 | 不可靠 | 维护候选键集合或使用 ZSet 抽样 |
| 扫描全部键 | 不适用 | SCAN 游标分批遍历 |
| 检查分布均匀性 | 不适用 | 按业务维度自行统计 |
抽样数量要足够:单次调用只给一个键,用脚本循环取几十到上百次并去重,才有参考意义。抽样结果只能作为线索,不能当结论。
RANDOMKEY 只作用于当前库,做集群级巡检需要对每个分片分别执行;结果里出现意外键名时,先确认自己连的实例与库是否正确。