技術(shù)分享:一步完成MySQL向Redis遷移
Ruby 發(fā)表于:13年01月07日 00:37 [來稿] DOIT.com.cn
在把一個(gè)大表從 MySQL 遷移到 Redis 時(shí),你可能會(huì)發(fā)現(xiàn),每次提取、轉(zhuǎn)換、導(dǎo)入一條數(shù)據(jù)是讓人難以忍受的慢!這里有一個(gè)技巧,你可以通過使用管道把 MySQL 的輸出直接輸入到 redis-cli輸入端,這可以使兩個(gè)數(shù)據(jù)庫都能以他們的最頂級(jí)速度來運(yùn)行。
使用了這個(gè)技術(shù),我把 800 萬條 MySQL 數(shù)據(jù)導(dǎo)入到 Redis 的時(shí)間從 90 分鐘縮短到了兩分鐘。
Mysql到Redis的數(shù)據(jù)協(xié)議
redis-cli命令行工具有一個(gè)批量插入模式,是專門為批量執(zhí)行命令設(shè)計(jì)的。這第一步就是把Mysql查詢的內(nèi)容格式化成redis-cli可用的數(shù)據(jù)格式。here we go!
我的統(tǒng)計(jì)表:
- 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)
- );
準(zhǔn)備在每行數(shù)據(jù)中執(zhí)行的redis命令如下:
- HSET events_all_time [action] [count]
按照以上redis命令規(guī)則,創(chuàng)建一個(gè)events_to_redis.sql文件,內(nèi)容是用來生成redis數(shù)據(jù)協(xié)議格式的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, 用下面的命令執(zhí)行:
- mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe
很重要的mysql參數(shù)說明:
--raw: 使mysql不轉(zhuǎn)換字段值中的換行符。
--skip-column-names: 使mysql輸出的每行中不包含列名。
公司簡介 | 媒體優(yōu)勢(shì) | 廣告服務(wù) | 客戶寄語 | DOIT歷程 | 誠聘英才 | 聯(lián)系我們 | 會(huì)員注冊(cè) | 訂閱中心
Copyright © 2013 DOIT Media, All rights Reserved. 北京楚科信息技術(shù)有限公司 版權(quán)所有.