redis全局遍历替换特征字符串
Posted wzy0623
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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后多了四个字节)或大数据集。
以上是关于redis全局遍历替换特征字符串的主要内容,如果未能解决你的问题,请参考以下文章