Redis7降级6备份不过期数据操作

server/2024/12/21 22:29:11/

Redis7降级6备份不过期数据操作

搜到三种备份方法
  • rdb版本11-》redis7;rdb版本9-》redis6;不兼容,版本太高无第三方工具转换。其中那个rdbtool白瞎断更好久了。
  • aof 使用aof -fix,文件大小没变,读取不了数据;不兼容,版本太高无第三方工具转换。找不到第三方工具,可能国内环境吧。
  • 使用redis-dump,需要ruby环境,ruby高版本在linux需要rvm,究极难安装,可能是虚拟机环境问题吧,其他服务器没有尝试,感觉是网络原因。尝试安装失败;windows安装成功ruby成功,redis-dump执行失败,不支持winodw远程连接redis,牛比plus。---------失败

redisttl_8">好了以上三种方式浪费了大半天时间,文件不兼容是早就知道的事情。换个思路。因为数据量比较小。只考虑备份redis中ttl数据,其他数据不重要。
  • lua脚本cjson encode导出redis数据到json文件,导出成功后,cjson的decode无法导入,奇葩。脚本是ok的。估计是json格式或者数据编码的问题,而且lua脚本中require在redis容器里还有限制使用。。。---------失败

新建思路: 需要将redis7降级,新增redis6容器,端口号、挂载目录、容器名称区分开,其他不变,开启aof哦。首选bash,,python要装环境,,服务器也不是随便乱动的地方,唉,巧妇难为无米之炊。
前提:非正式环境!自己考虑正式环境就别降级了,数据参差不齐的。

就是进入redis7容器内部, 查找所有key,取ttl=-1的key进行操作,赋值给变量后,火速到redis6的容器内部,进行set操作。一共20条数据哈。此时,redis6的data目录下的aof和rdb就是新鲜的20条数据的低版本文件了。

docker stop redis7。直接将上一步redis6的aof和rdb放到redis7下,,修改redis7的镜像号,compose即可。重建容器后,里边就只剩下ttl=-1的数据了。

更换脚本了哈,有一些值的特殊字符问题,特殊处理,自己看着搜索吧。
gpt帮助的脚本内容。SET命令后不需要添加EX -1
#!/bin/bash# Docker Redis1 连接信息
REDIS1_CONTAINER="redis7"
REDIS1_HOST=host
REDIS1_PORT=63179
REDIS1_PW=xx# Docker Redis2 连接信息
REDIS2_CONTAINER="redis6"
REDIS2_HOST=host
REDIS2_PORT=63279
REDIS2_PW=xx# 在 Docker Redis1 中查询所有 ttl=-1 的键值对和过期时间
KEYS=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw keys '*')
for KEY in $KEYS; doTTL=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW ttl $KEY)# 使用整数比较if [ "$TTL" -eq -1 ]; thenTYPE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW type $KEY)VALUE=""if [ "$TYPE" = "string" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw get $KEY)elif [ "$TYPE" = "set" ]; thenMEMBERS=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw smembers $KEY)for MEMBER in $MEMBERS; doDECODED_MEMBER=$(echo -n "$MEMBER" | awk -F 'did:' '{print "did:"$2}' | iconv -f ISO-8859-1 -t UTF-8)echo "Redis1 Key: $KEY, DECODED_MEMBER: $DECODED_MEMBER"# 在 Docker Redis2 中执行对应的命令docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW sadd $KEY "$DECODED_MEMBER"doneelif [ "$TYPE" = "list" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw lrange $KEY 0 -1)elif [ "$TYPE" = "hash" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw hgetall $KEY)elif [ "$TYPE" = "zset" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw zrange $KEY 0 -1 withscores)fiif [ -n "$VALUE" ]; thenecho "Redis1 Key: $KEY, Value: $VALUE"# 在 Docker Redis2 中执行对应的命令if [ "$TYPE" = "string" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW set $KEY "$VALUE"elif [ "$TYPE" = "list" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW rpush $KEY "${VALUE[@]}"elif [ "$TYPE" = "hash" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW hmset $KEY "${VALUE[@]}"elif [ "$TYPE" = "zset" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW zadd $KEY "${VALUE[@]}"fiecho "Redis2 Key: $KEY, Value: $VALUE"fifi
doneecho "Data synchronization complete."

http://www.ppmy.cn/server/40540.html

相关文章

idea配置hive

idea配置hive 今天才知道,idea居然可以配置hive,步骤如下: view -> Tool Windows -> Database Database出来了之后,直接配置即可

类和对象一(从封装开始讲述)

目录: 一.封装 二.封装扩展之包,自定义包 三.访问限定符 四.static成员 一.封装:封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。面向对象…

MongoDB聚合运算符:$toDouble

MongoDB聚合运算符:$toDouble 文章目录 MongoDB聚合运算符:$toDouble语法使用举例 $toDouble聚合运算符将指定的值转换为Double类型。如果指定的值为空或缺失,则返回null;如果值无法被转换为Double,则报错。 语法 {$t…

『大模型笔记』AI教母李飞飞谈人工智能的前景与危险!

AI教母李飞飞谈人工智能的前景与危险! 文章目录 一. AI教母李飞飞谈人工智能的前景与危险!1. 总结2. 全文内容二. 参考文献油管原视频:https://www.youtube.com/watch?v=FW5CypL1XOY一. AI教母李飞飞谈人工智能的前景与危险! 1. 总结 以下是整理后的中文内容: 李飞飞博…

巡检机器人有哪些功能和作用?

在科技如此发达的时代,巡检机器人犹如一位不知疲倦的守护者,悄然走进了我们的生活。它们具备着令人惊叹的功能和作用,成为了保障安全、提高效率的重要力量。那么,巡检机器人功能和作用?下面我们来说说旗晟机器人的几款…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型(LLM)应用程序的开源库。简单来说,如果你想要开发一个能够通过声音与用户进行实时交流的应用,比如电话机器人、语音助手…

Go编程语言的调试器Delve | Goland远程连接Linux开发调试(go远程开发)

文章目录 Go编程语言的调试器一、什么是Delve二、delve 安装安装报错cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH解决 三、delve命令行使用delve 常见的调试模式常用调试方法todo调试程序代码与动态库加载程序运行…

算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 解题思路: 双指针…