您的位置:首页 > 数据库 > Redis

将MySQL数据迁移到Redis

2016-02-25 08:57 405 查看
做开发的同学都知道,一旦设计到底层存储优化,数据结构甚至数据库的变更,通常都会进行数据迁移的工作。如果系统运行时间过长,数据迁移的数量可能非常庞大。这时候,如何进行高效的数据迁移,实际也是上线质量的直接影响因素之一。

下面内容是转载的一个小技巧,无法适用于各种变化的场景,仅供大家参考。

场景是从MySQL中将数据导入到Redis的Hash结构中。当然,最直接的做法就是遍历MySQL数据,一条一条写入到Redis中。这样可能没什么错,但是速度会非常慢。而如果能够使MySQL的查询输出数据直接能够与Redis命令行的输入数据协议相吻合,可能就省事多了。

800w的数据迁移,时间从90分钟缩短到2分钟。

案例如下:

MySQL数据表结构:

1
CREATE
TABLE
events_all_time
(
2
id
int
(11)
unsigned
NOT
NULL
AUTO_INCREMENT,
3
action
varchar
(255)
NOT
NULL
,
4
count
int
(11)
NOT
NULL
DEFAULT
0,
5
PRIMARY
KEY
(id),
6
UNIQUE
KEY
uniq_action
(
action
)
7
);
Redis存储结构:

HSET events_all_time [action] [count]

下面是重点,能过下面SQL语句将MySQL输出直接变更成redis-cli可接收的格式:

1
#
vim events_to_redis.sql
2
SELECT
CONCAT(
3
"*4\r\n"
,
4
'$'
,
LENGTH(redis_cmd),
'\r\n'
,
5
redis_cmd,
'\r\n'
,
6
'$'
,
LENGTH(redis_key),
'\r\n'
,
7
redis_key,
'\r\n'
,
8
'$'
,
LENGTH(hkey),
'\r\n'
,
9
hkey,
'\r\n'
,
10
'$'
,
LENGTH(hval),
'\r\n'
,
11
hval,
'\r'
12
)
13
FROM
(
14
SELECT
15
'HSET'
as
redis_cmd,
16
'events_all_time'
AS
redis_key,
17
action
AS
hkey,
18
count
AS
hval
19
FROM
events_all_time
20
)
AS
t
然后用管道符重定向输出即可:

1
#
mysql stats_db --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe
使用redis内部的数据格式然后走pipeline,比遍历mysql一行一行的写redis快多了!

转自:http://dcw.ca/blog/2013/01/02/mysql-to-redis-in-one-step/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: