测试后百万级数据几秒导入,并且没有丢失数据,因用的私人电脑太辣鸡,没测试到千万数据redis就挂了
mysql 按格式拼接导出redis pipe需要的数据
SELECT
concat(
'*5', // 按空格拆分有几段 表示这条命令的行数
'\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需要的数据
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 执行结果(news):
- 方式一
//musql 命令行运行
mysql -uroot -p123456 -D 数据库名 --skip-column-names --raw < news
--skip-column-names:不显示列名
--raw:原生输出,不做任何转义
news:要输出文件的文件名
-
方式二
执行查询后
中间两个下一步,选择具体的导出路径
然后点下一步-开始
至此,数据构造完毕。将文件上传到服务器,批量插入 redis:
//在linux服务器上运行(如果你知道如何在window上如何执行,请指点一下)
cat 文件 | redis-cli --pipe
--pipe : 使用管道