发布网友 发布时间:2022-04-08 06:20
共2个回答
懂视网 时间:2022-04-08 10:42
,保存为data.txt然后使用 redis的客户端 redis-cli的管道传输(redis的版本要大于2.6)
linux下使用命令:
cat data.txt | redis-cli --pipe
成功的话就会出现如下结果:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 3
虽然第一种方法比较方便,不过存在的问题是,有时redis无法正确解释数据,所有推荐的第二种方式
此协议数据的格式如下:
*3<cr><lf> $3<cr><lf> SET<cr><lf> $3<cr><lf> key<cr><lf> $5<cr><lf> value<cr><lf>
意义如下:
第一行: *3<cr><lf> : 星号*是规定格式;3是参数的个数(如上:SET、key、value) ;<cr>是‘ ‘; <lf>是‘ ‘。
第二、三行: $3<cr><lf> : $是规定格式;3是对应命令SET的长度(3个字母);<cr><lf>同上
所以上述格式又可写成:
*3 $3 SET $3 key $5 value
将数据按上述协议的格式导出来,然后再通过redis-cli --pipe导入
例子:
建表语句:
CREATE TABLE `device_type` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, `class` varchar(500) NOT NULL, `class_guid` varchar(500) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`), KEY `idx_class` (`class`(50),`class_guid`(200)) ) ENGINE=MyISAM AUTO_INCREMENT=287 DEFAULT CHARSET=utf8; SELECT * FROM drivers_lookup_com.driver_files;
导出数据并转换成redis-cli能处理的格式:
SELECT CONCAT( "*8 ", ‘$‘,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,‘ ‘ )FROM( SELECT ‘HMSET‘ AS redis_cmd, id AS redis_key, ‘name‘ AS hkey1, name AS hval1, ‘class‘ AS hkey2,class AS hval2, ‘class_guid‘ AS hkey3,class_guid AS hval3 From device_type )AS t
转换的命令如下:
mysql -h192.168.0.104 -uroot -p123 device --skip-column-names --raw < device.sql | src/redis-cli --pipe
MySQL导数据到Redis
标签:
热心网友 时间:2022-04-08 07:50
从mysql搬一个大表到redis中,你会发现在提取、转换或是载入一行数据时,速度慢的让你难以忍受。这里我就要告诉一个让你解脱的小技巧。使用“管道输出”的方式把mysql命令行产生的内容直接传递给redis-cli,以绕过“中间件”的方式使两者在进行数据操作时达到最佳速度。