从MySQL到Redis 提升数据迁移的效率
2015-06-02 13:42
561 查看
做开发的同学都知道,一旦设计到底层存储优化,数据结构甚至数据库的变更,通常都会进行数据迁移的工作。如果系统运行时间过长,数据迁移的数量可能非常庞大。这时候,如何进行高效的数据迁移,实际也是上线质量的直接影响因素之一。
下面内容是转载的一个小技巧(原文),无法适用于各种变化的场景,仅供大家参考。
场景是从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\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
然后用管道符重定向输出即可:
mysql stats_db --skip-column-names --raw <</span> events_to_redis.sql
| redis-cli --pipe
原文地址:http://tech.it168.com/a2013/0806/1517/000001517449.shtml
下面内容是转载的一个小技巧(原文),无法适用于各种变化的场景,仅供大家参考。
场景是从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\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
然后用管道符重定向输出即可:
mysql stats_db --skip-column-names --raw <</span> events_to_redis.sql
| redis-cli --pipe
原文地址:http://tech.it168.com/a2013/0806/1517/000001517449.shtml
相关文章推荐
- 使用Redis实现高并发分布式序列号生成服务
- redis键的数据结
- 【redis入门】 redis常用的键
- redis之RDB持久化策略
- Session原理、安全以及最基本的Express和Redis实现
- redis之AOF持久化机制
- Redis配置文件参数说明
- Redis入门系列之安装redis和配置redis
- Redis入门系列数据类型及相关命令
- PHP-redis中文文档
- centos下安装redis,并且设置自启动脚本
- Redis 起步
- How to install redis server on CentOS 7 / RHEL 7
- Redis学习(管线)
- CentOS中Redis的启动文件
- Arrays of Length Zero在redis中的应用
- redis添加开机启动
- Redis3.0.1 Stable版本的集群部署(Mac)
- redis 学习的一些笔记
- Redisson操作Redis之基础篇