Redis判断哪些key没有设置过期时间

半兽人 发表于: 2025-01-27   最后更新时间: 2025-01-27 01:13:23  
{{totalSubscript}} 订阅, 28 游览

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 个。

更新于 2025-01-27

查看redis更多相关的文章或提一个关于redis的问题,也可以与我们一起分享文章