1. 导出没设置过期的Key
Redis 的 TTL 用于表示 key 的过期时间:
- 如果 TTL 返回 -1,说明 key 没有设置过期时间(永久存在)。
- 如果 TTL 返回 -2,说明 key 已经过期或不存在。
可以使用 SCAN 遍历所有 key,并通过 TTL 判断哪些 key 没有设置过期时间。
#!/bin/bash
# 输出文件
output_file="no_ttl_keys.txt"
# 初始化游标
cursor=0
batch_size=1000 # 每次扫描的 key 数量,建议根据 Redis 性能调整
# 遍历所有 key
while [[ $cursor -ne 0 || $keys == "" ]]; do
# 使用 SCAN 获取一批 key,显式设置 COUNT
response=$(redis-cli SCAN $cursor COUNT $batch_size)
cursor=$(echo "$response" | head -n 1) # 更新游标
keys=$(echo "$response" | tail -n +2) # 获取 key 列表
# 遍历 key,检查 TTL
for key in $keys; do
ttl=$(redis-cli TTL "$key")
if [[ $ttl -eq -1 ]]; then
echo "$key" >> "$output_file"
fi
done
done
echo "没有设置 TTL 的 key 已保存到 $output_file"
2. 对 key 进行分类
一般情况下,key 有特定的命名规则(例如 prefix:subprefix:key
),可以通过前缀进行分类。
使用 shell 脚本对 key 分类
cat no_ttl_keys.txt | awk -F: '{print $1}' | sort | uniq -c > key_classes.txt
输出示例:
150 user
90 session
60 product
这表示 user
前缀的 key 有 150 个,session
有 90 个。