一步完成MySQL向Redis迁移

发表于:2013-1-08 09:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zzxworld/Tom    来源:51Testing软件测试网采编

  在把一个大表从 MySQL 迁移到 Redis 时,你可能会发现,每次提取、转换、导入一条数据是让人难以忍受的慢!这里有一个技巧,你可以通过使用管道把 MySQL 的输出直接输入到 redis-cli输入端,这可以使两个数据库都能以他们的最顶级速度来运行。

  使用了这个技术,我把 800 万条 MySQL 数据导入到 Redis 的时间从 90 分钟缩短到了两分钟。

  Mysql到Redis的数据协议

  redis-cli命令行工具有一个批量插入模式,是专门为批量执行命令设计的。这第一步就是把Mysql查询的内容格式化成redis-cli可用的数据格式。here we go!

  我的统计表:

  1. CREATE TABLE events_all_time (  
  2.   id int(11) unsigned NOT NULL AUTO_INCREMENT,  
  3.   action varchar(255) NOT NULL,  
  4.   count int(11) NOT NULL DEFAULT 0,  
  5.   PRIMARY KEY (id),  
  6.   UNIQUE KEY uniq_action (action)  
  7. );

  准备在每行数据中执行的redis命令如下:

HSET events_all_time [action] [count]

  按照以上redis命令规则,创建一个events_to_redis.sql文件,内容是用来生成redis数据协议格式的SQL

  1. -- events_to_redis.sql 
  2. SELECT CONCAT(  
  3.   "*4\r\n",  
  4.   '$', LENGTH(redis_cmd), '\r\n',  
  5.   redis_cmd, '\r\n',  
  6.   '$', LENGTH(redis_key), '\r\n',  
  7.   redis_key, '\r\n',  
  8.   '$', LENGTH(hkey), '\r\n',  
  9.   hkey, '\r\n',  
  10.   '$', LENGTH(hval), '\r\n',  
  11.   hval, '\r' 
  12. )  
  13. FROM (  
  14.   SELECT 
  15.   'HSET' as redis_cmd,  
  16.   'events_all_time' AS redis_key,  
  17.   action AS hkey,  
  18.   count AS hval  
  19.   FROM events_all_time  
  20. AS t

  ok, 用下面的命令执行:

mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe

  很重要的mysql参数说明:

  --raw:使mysql不转换字段值中的换行符。

  --skip-column-names:使mysql输出的每行中不包含列名。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号