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

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。---------失败

好了以上三种方式浪费了大半天时间,文件不兼容是早就知道的事情。换个思路。因为数据量比较小。只考虑备份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; do
    TTL=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW ttl $KEY)
    # 使用整数比较
    if [ "$TTL" -eq -1 ]; then
        VALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw get $KEY)
        echo "Redis1 Key: $KEY, Value: $VALUE"
        # 在 Docker Redis2 中执行 SET 命令,并设置过期时间
        docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW set $KEY "$VALUE"
        echo "Redis2 Key: $KEY, Value: $VALUE"
    fi
done

echo "Data synchronization complete."

上一篇:Android 状态栏WiFi图标的显示逻辑


下一篇:springcloud整合网关(springcloud-gateway)