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

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

In moving a relatively large table from MySQL to Redis, you may find that extracting, transforming and loading a row at a time can be excruciatingly slow. Here’s a quick trick you can use that pipes the output of themysqlcommand directly toredis-cli, bypassing middleware and allowing both data stores to operate at their peak speed.

Using this technique I was able to reduce my load time of ~8 million rows from 90 minutes down to two. Shabby? I think not.

已有 2 人翻译此段
我来翻译

Redis Protocol Output from MySQL

redis-clihas a mass-insert mode, specially designed to execute bulk commands as quickly as possible. Input is expected to be formatted in raw redis protocol, which is simple enough to be generated from MySQL SELECT queries. Here we go!

已有 1 人翻译此段
我来翻译

My stats table:

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)
);
Desired Redis command to be run for each row:
HSET events_all_time [action] [count]
SQL statement to produce Redis-protocol-formatted output:
-- 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
Tying it all together:
mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe
It’s important to use the--rawswitch so that MySQL doesn’t rewrite the crucial newline characters, and--skip-column-nameskeeps the formatted output clear of column headers.

已有 1 人翻译此段
我来翻译
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 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)这儿了,老报错?
鱼龙帅
为什么我一直报错!
返回顶部
顶部