測試后百萬級數(shù)據(jù)幾秒導入,并且沒有丟失數(shù)據(jù),因用的私人電腦太辣雞,沒測試到千萬數(shù)據(jù)redis就掛了
mysql 按格式拼接導出redis pipe需要的數(shù)據(jù)
SELECT
concat(
'*5', // 按空格拆分有幾段 表示這條命令的行數(shù)
'\r\n',
'$5', // 代表 hmset 的字符長度 說明下一條代碼的長度
'\r\n',
'hmset',
'\r\n',
'$12', // 代表 address_name的字符長度,以此類推·
'\r\n',
'address_name',
'\r\n',
'$',
LENGTH(address_name), // 計算字段值的長度
'\r\n',
address_name, // 輸出字段的值
'\r\n',
'$2',
'\r\n',
'id',
'\r\n',
'$',
LENGTH(id),
'\r\n',
id,
'\r'
)
FROM
lsx_code_address;
java 按格式拼接出redis pipe需要的數(shù)據(jù)
public class sdf {
/**
* 格式化成輸入字符串
* @param args
* @return
*/
public static void main(String[] args) {
initFile2();
}
private static String getString(String... args){
StringBuilder sb = new StringBuilder();
sb.append("*").append(args.length).append("\r\n");
for(String arg : args){
sb.append("$").append(arg.length()).append("\r\n");
sb.append(arg).append("\r\n");
}
return sb.toString();
}
public static void initFile2(){
String file= "E:\\2.txt";
BufferedWriter w = null;
StringBuilder sb = new StringBuilder();
try {
w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));
for(int i=10000000 ;i <= 10100000;i++){
sb.setLength(0);
sb.append(getString("hmset","usr"+i,"userid","usr"+i,"username","usrname"+i));
w.append(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
assert w != null;
w.flush();
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
導出 sql 執(zhí)行結(jié)果(news):
- 方式一
//musql 命令行運行
mysql -uroot -p123456 -D 數(shù)據(jù)庫名 --skip-column-names --raw < news
--skip-column-names:不顯示列名
--raw:原生輸出,不做任何轉(zhuǎn)義
news:要輸出文件的文件名
-
方式二
執(zhí)行查詢后
image.png中間兩個下一步,選擇具體的導出路徑
image.png
然后點下一步-開始
至此,數(shù)據(jù)構(gòu)造完畢。將文件上傳到服務器,批量插入 redis:
//在linux服務器上運行(如果你知道如何在window上如何執(zhí)行,請指點一下)
cat 文件 | redis-cli --pipe
--pipe : 使用管道