一步完成MySQL向Redis的迁移

日期: 2013-01-05 作者:oschina 来源:TechTarget中国 英文

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

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

  Mysql到Redis的数据协议

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

  我的统计表:

CREATE TABLE events_all_time (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  action varchar(255) NOT NULL,
  count int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (id),
  UNIQUE KEY uniq_action (action)
);

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

HSET events_all_time [action] [count]

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

— events_to_redis.sql
SELECT CONCAT(
  “*4rn”,
  ‘$’, LENGTH(redis_cmd), ‘rn’,
  redis_cmd, ‘rn’,
  ‘$’, LENGTH(redis_key), ‘rn’,
  redis_key, ‘rn’,
  ‘$’, LENGTH(hkey), ‘rn’,
  hkey, ‘rn’,
  ‘$’, LENGTH(hval), ‘rn’,
  hval, ‘r’
)
FROM (
  SELECT
  ‘HSET’ as redis_cmd,
  ‘events_all_time’ AS redis_key,
  action AS hkey,
  count AS hval
  FROM events_all_time
) AS t

  ok, 用下面的命令执行:

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

  很重要的mysql参数说明:

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

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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

oschina
oschina

相关推荐