调试含TTL的Redis RDB文件:如何忽略过期保留键值?
解决Redis加载RDB时保留过期键的方案
嘿,这个问题我之前调试老系统的时候也碰到过,完全不用改系统时间,给你两个实用的方案:
方案一:直接解析RDB文件(最省心)
不用启动Redis,用专门的RDB解析工具直接提取所有键值,包括已过期的。推荐用rdbtools,这是个Python工具,能直接读取RDB文件的内容:
- 先安装工具:
pip install rdbtools python-lzf
- 导出所有键的JSON格式(包含过期时间和值):
rdb --command json /path/to/your/old.rdb > all_keys.json
- 如果想生成可以直接导入Redis的命令(不带过期时间),用dump模式:
rdb --command dump /path/to/your/old.rdb > restore_commands.txt
之后你可以把restore_commands.txt里的命令导入到Redis,所有键都会保留,不会被自动删除。
方案二:临时Redis实例+键复制(适合需要在Redis里调试的场景)
如果必须把键加载到Redis里调试,可以用这个方法,避免过期键被自动清理:
- 启动一个临时Redis实例,用独立端口(比如6380),关闭持久化避免覆盖文件:
redis-server --port 6380 --save "" --appendonly no --maxmemory-policy noeviction
- 停止这个临时实例,把你要调试的RDB文件替换成它的
dump.rdb(默认路径是当前目录,你可以用--dir参数指定路径):
redis-cli -p 6380 SHUTDOWN cp /path/to/your/old.rdb ./dump.rdb
- 重新启动临时实例:
redis-server --port 6380 --save "" --appendonly no --maxmemory-policy noeviction
- 立刻用脚本复制所有键,去掉过期时间(避免后续被删除):
redis-cli -p 6380 --scan | while read key; do # 导出键的二进制内容 dump_value=$(redis-cli -p 6380 DUMP "$key") # 恢复成新的键(比如加个后缀),不设置过期时间 redis-cli -p 6380 RESTORE "${key}_debug" 0 "$dump_value" done
现在你就可以在这个临时实例里查看*_debug结尾的键了,它们不会被Redis自动过期删除。
小技巧
如果你只是要查看个别键,也可以用rdbtools的--key参数过滤,比如只看前缀为user:的键:
rdb --command json /path/to/your/old.rdb --key "user:*"
内容的提问来源于stack exchange,提问作者mguijarr
相关产品推荐
相关产品推荐

