從MySQL到Redis提升資料遷移的效率

信海龍發表於2016-04-12
場景是從MySQL中將資料匯入到Redis的Hash結構中。當然,最直接的做法就是遍歷MySQL資料,一條一條寫入到Redis中。這樣可能沒什麼錯,但是速度會非常慢。而如果能夠使MySQL的查詢輸出資料直接能夠與Redis命令列的輸入資料協議相吻合,可能就省事多了。
根據測試800w的資料遷移,時間從90分鐘縮短到2分鐘。
具體案例如下:

MySQL資料表結構:

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] 

下面是重點,能過下面SQL語句將MySQL輸出直接變更成redis-cli可接收的格式:

-- events_to_redis.sql

SELECT CONCAT(
 "*4
",
 `$`, LENGTH(redis_cmd), `
`,
 redis_cmd, `
`,
 `$`, LENGTH(redis_key), `
`,
 redis_key, `
`,
 `$`, LENGTH(hkey), `
`,
 hkey, `
`,
 `$`, LENGTH(hval), `
`,
 hval, `
`
 )
 FROM (
 SELECT
 `HSET` as redis_cmd,
 `events_all_time` AS redis_key,
 action AS hkey,
 count AS hval
 FROM events_all_time
 ) AS t 

然後用管道符重定向輸出即可:

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


相關文章