Contents

rdb command

一些 Redis 内存分析、清理脚本

Redis 内存了近 32GB 的计数。

使用 redis-cli 删除符合前缀匹配的所有 key。

export REDISCLI_AUTH=""
export REDIS_HOST="localhost"
# SCAN 是一个非阻塞的迭代命令,可以逐步获取匹配的键,适用于大型数据库。它使用游标来分批返回结果,不要使用 KEYS
redis-cli -h $REDIS_HOST --scan --pattern "f1:i00004*" | xargs -I {} -t redis-cli -h $REDIS_HOST del {}

二次开发了 rdb。可以基于 rdb 进行分析和操作。

# 下载、解压到本地 https://github.com/XUJiahua/rdb/releases
wget https://github.com/XUJiahua/rdb/releases/download/v0.2.1/rdb_0.2.1_linux_amd64.tar.gz
tar -xzvf rdb_0.2.1_linux_amd64.tar.gz

# 下载 redis 备份 dump.rdb
# 阿里云控制台提供了内网下载地址
wget -O dump.rdb "http://rdsbak-hk-v3-3az.oss-cn-hongkong-internal.aliyuncs.com/custins62059427/hins33306587_data_20250611150501.rdb" 

# 分析内存占用
# prefixv2 原版 prefix 命令会爆内存
# -max-depth 10 按前10个字符分组统计内存占用
# -n 200 top 200
./rdb -c prefixv2 -n 200 -max-depth 10 dump.rdb

# 因为设计失误,时间字段在整个 key 的最后
# 从 dump.rdb 中使用正则过滤,然后根据日期进一步过滤,默认是打印每个 key,打印到标准输出,可以通过管道与其他命令组合使用
# 20250401 之前的数据,比较的是 key 的最后一个字段
# 正则先使用工具测试 https://regex101.com/
./rdb -c filter -filter-date '20250401' -regex 'f1:i00066:.*' dump.rdb
f1:100066:xxxxxx:2025030505

# 对过滤内容进行聚合,key 数量,key 占用空间,对要清理多少空间有数
./rdb -c filter -filter-date '20250401' -regex 'f1:i00066:.*' -action sum dump.rdb
key count: 4802086,* 4802086, total size: 940581576(897M)

# 对过滤内容进行删除,使用内置 redis client 删除
export REDIS_ADDR="localhost:6379"
export REDIS_PASSWORD=""
export REDIS_DB="0"
./rdb -c filter -filter-date '20250401' -regex 'f1:i00136:.*' -action del dump.rdb

k8s 内操作

kubectl run redis-client -i --tty --image redis:7-alpine -- sh
# 耗时任务建议在 tmux 内执行
apk add tmux