一步完成 MySQL 向 Redis 迁移 已翻译 100%

oschina 投递于 2013/01/03 09:38 (共 3 段, 翻译完成于 01-05)
阅读 30161
收藏 172
36
加载中

从mysql搬一个大表到redis中,你会发现在提取、转换或是载入一行数据时,速度慢的让你难以忍受。这里我就要告诉一个让你解脱的小技巧。使用“管道输出”的方式把mysql命令行产生的内容直接传递给redis-cli,以绕过“中间件”的方式使两者在进行数据操作时达到最佳速度。

一个约八百万行数据的mysql表,原本导入到redis中需要90分钟,使用这个方法后,只需要两分钟。不管你信不信,反正我是信了。

zzxworld
翻译于 2013/01/05 14:12
16

Mysql到Redis的数据协议

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

zzxworld
翻译于 2013/01/05 14:36
6

我的统计表:

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(
  "*4\r\n",
  '$', LENGTH(redis_cmd), '\r\n',
  redis_cmd, '\r\n',
  '$', LENGTH(redis_key), '\r\n',
  redis_key, '\r\n',
  '$', LENGTH(hkey), '\r\n',
  hkey, '\r\n',
  '$', LENGTH(hval), '\r\n',
  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输出的每行中不包含列名。
zzxworld
翻译于 2013/01/05 14:57
7
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(30)

炭烧xxs
炭烧xxs
如果我的redis 有选库,比如select 1,我该怎么弄?
L
LeonardYP
在win7上面mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe会直接崩掉呢
swq
swq
ERR Protocol error: expected '$', got ' ' 这个是什么问题?
清风_
清风_
mark
lilien
lilien
用HSET会提示错误 改用HMSET就行。 有点纠结······
他是对单条的,多条记录就是hmset
另外有个问题 就是结果集里面有null,null也是会给输出,造成输出的字符串信息错误
moxiaomomomo
moxiaomomomo
用HSET会提示错误 改用HMSET就行。 有点纠结
冰雷卡尔
冰雷卡尔

引用来自“Tom-Lin”的评论

我哭了,每次我翻译完提交后,总是发现,别人已经翻译完并已经提交了

大神 弱弱的问一句 这个命令的执行是否需要redis和mysql在同一台机器啊
mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe
冰雷卡尔
冰雷卡尔

引用来自“Tom-Lin”的评论

我哭了,每次我翻译完提交后,总是发现,别人已经翻译完并已经提交了

大神 弱弱的问一句 这个命令的执行是否需要redis和mysql在同一台机器啊
mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe
yolanda_YM
yolanda_YM
为什么到ssize_t nwritten = write(fd,obuf+obuf_pos,(unsigned int)obuf_len)这儿了,老报错?
鱼龙帅
为什么我一直报错!
返回顶部
顶部