redis全局遍历替换特征字符串

需求:将一个redis实例(如10.10.10.1:6379)范围内所有key值中的 .letssing.net 替换为 .kaixinvv.com。

实现:

1. 确定替换规则
http://txcdn-file-m-mvbox-cn.letssing.net/ -> http://txcdn-file-m-mvbox-cn.kaixinvv.com/
https://msgimg.letssing.net/               -> https://msgimg.kaixinvv.com/
http://file-m-mvbox-cn.letssing.net/       -> http://file-m-mvbox-cn.kaixinvv.com/
http://txcdn-mpres.letssing.net/           -> http://txcdn-mpres.kaixinvv.com/
https://msgvoice.letssing.net/             -> https://msgvoice.kaixinvv.com/  
https://music.letssing.net/                -> https://music.kaixinvv.com/
https://music.51vv.com/                    -> https://music.kaixinvv.com/

2. 确认master实例

/home/redis/redis-5.0.3/src/redis-cli -h 10.10.10.1 -p 6379 info | grep master | grep -v sentinel_masters | awk -F"," '{print $3}' | awk -F"=" '{print $2}' 

3. 导出数据

export REDISDUMPGO_AUTH=123456
./redis-dump-go -host 10.10.10.1 -port 6379 -n 12 > data.txt

# 备份文件
cp -f data.txt data.txt.bak

说明:使用redis-dump-go工具导出redis数据,结果是RESP协议的报文。例如:

*3 //* 表示报文的开始,3 表示有三个参数,分别是 set、key1、value1
$3 // $3 表示第一个参数长度为 3 个字节
set  // 一个参数
$4 // 第二个参数长度为 4 个字节
key1 // 第二个参数
$6 // 第三个参数长度为 6 个字节
value1 // 第三个参数

关于redis-dump-go的说明参见“https://github.com/yannh/redis-dump-go”。

4. 替换字符串
(1)使用sed命令

sed -e 's/http:\/\/txcdn-file-m-mvbox-cn.letssing.net\//http:\/\/txcdn-file-m-mvbox-cn.kaixinvv.com\//g;s/https:\/\/msgimg.letssing.net\//https:\/\/msgimg.kaixinvv.com\//g;s/http:\/\/file-m-mvbox-cn.letssing.net\//http:\/\/file-m-mvbox-cn.kaixinvv.com\//g;s/http:\/\/txcdn-mpres.letssing.net\//http:\/\/txcdn-mpres.kaixinvv.com\//g;s/https:\/\/msgvoice.letssing.net\//https:\/\/msgvoice.kaixinvv.com\//g' -i data.txt

适用情况:替换后字节数无变化的小数据集。

(2)使用java程序
cat Test.java

import java.io.*;

/**
 * @Author: mumu
 * @Date: 2023/2/21
 * @Description:
 */
public class Test {
    public static void main(String[] args) throws IOException {
        //原始文件位置
        String inputFile="/home/redis/data.txt.bak";

        //输出文件位置
        String outputFile="/home/redis/data.txt";

        //创建输入流
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));
        //创建输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(outputFile))));

        String str="";
        while ((str=br.readLine())!=null){
            //识别行头
            if(str.charAt(0)=='$'){
                //再读一行
                String content=br.readLine();
                if(content!=null && (content.contains("https://music.letssing.net/") || content.contains("https://music.51vv.com"))) {
                    content = content.replaceAll("https://music.letssing.net/", "https://music.kaixinvv.com/");
                    content = content.replaceAll("https://music.51vv.com/", "https://music.kaixinvv.com/");

                    //统计这行的字符
                    int lineLength = content.getBytes().length;

                    //输出内容
                    bw.write("$" + lineLength + "\r\n");
                    bw.write(content + "\r\n");
                } else {bw.write(str+"\r\n");bw.write(content+"\r\n");}
            }else {
                bw.write(str+"\r\n");
            }
        }
        bw.flush();
        //关闭输入输出流
        br.close();
        bw.close();
    }
}

# 执行
java Test

适用所有情况,尤其是替换后字节数发生变化(如51vv.com替换为kaixinvv.com后多了四个字节)或大数据集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值