mysql数据向Redis快速导入

Redis协议

*<args><cr><lf> 参数个数
$<len><cr><lf> 第一个参数长度
<arg0><cr><lf> 第一个参数
$<len><cr><lf> 第一个参数长度
<arg1><cr><lf> 第二个参数
... ...

编写SQL语句,把mysql数据组合成Redis协议数据流

SELECT CONCAT(
"*16
",
'$', LENGTH(redis_cmd), '
',redis_cmd, '
','$', LENGTH(redis_key), '
',redis_key, '
',
'$', LENGTH(hkey1), '
',hkey1, '
','$', LENGTH(hval1), '
', hval1, '
'
'$', LENGTH(hkey2), '
',hkey2, '
','$', LENGTH(hval2), '
', hval2, '
'
'$', LENGTH(hkey3), '
',hkey3, '
','$', LENGTH(hval3), '
', hval3, '
'
'$', LENGTH(hkey4), '
',hkey4, '
','$', LENGTH(hval4), '
', hval4, '
'
'$', LENGTH(hkey5), '
',hkey5, '
','$', LENGTH(hval5), '
', hval5, '
'
'$', LENGTH(hkey6), '
',hkey6, '
','$', LENGTH(hval6), '
', hval6, '
'
'$', LENGTH(hkey7), '
',hkey7, '
','$', LENGTH(hval7), '
', hval7, '
'
)
FROM (
 SELECT
'HMSET' AS redis_cmd, CONCAT(resource_id,'_hash') AS redis_key,
'name' AS hkey1,resource_title  AS hval1,
'type' AS hkey2,resource_type_name AS hval2,
'exe' AS hkey3,resource_format AS hval3,
'page' AS hkey4,resource_page AS hval4,
'size' AS hkey5,resource_size AS hval5,
'time' AS hkey6,create_time AS hval6,
'num' AS hkey7,resource_downcount AS hval7
 FROM t_resource_info
 ) AS t

拼出来的串

*16
$5
HMSET
$9
NBA231058
$4
name
$51
绿色食品的定义及绿色食品标志的使用
$4
type
$6
文本
$3
exe
$3
doc
$4
page
$1
1
$4
size
$6
79.5KB
$4
time
$19
2013-05-31 08:56:59
$3
num
$2
18

执行下面的语句

mysql -h 10.10.3.218 -uroot -p123456 -Dtest_db --skip-column-names --raw </usr/local/redis.sql |redis-cli --pipe

–raw: 使mysql不转换字段值中的换行符。
–skip-column-names: 使mysql输出的每行中不包含列名。

单独执行

echo -en '*3
$3
SET
$3
key
$5
value
' | redis-cli --pipe

 经测试200W条数据,2分钟以内就可以完成。

原文地址:https://www.cnblogs.com/kgdxpr/p/3643672.html