场景是从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 < events_to_redis.sql | redis-cli --pipe

从MySQL到Redis 提升数据迁移的效率的更多相关文章

  1. 通过Gearman实现MySQL到Redis的数据同步

    对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...

  2. Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

    [TOC] 1, 环境 CentOS, MySQL, Redis, Nodejs 2, Redis简介 Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list ...

  3. 从MySQL到Hive,数据迁移就这么简单

    使用Sqoop能够极大简化MySQL数据迁移至Hive之流程,并降低Hadoop处理分析任务时的难度. 先决条件:安装并运行有Sqoop与Hive的Hadoop环境.为了加快处理速度,我们还将使用Cl ...

  4. 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移

    http://blog.csdn.net/dba_waterbin/article/details/8996872 ㈠ Redis 与 MySQL 的耦合性            在业务架构早期.我们 ...

  5. JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

    MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...

  6. 数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

    From:https://my.oschina.net/simpleton/blog/525675 一.什么是ETL ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数 ...

  7. Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移

    目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...

  8. redis无损数据迁移

    在dba眼中,redis仅仅是一个缓存,不适合作为存储来使用,不管是redis-sentinel集群还是cluster集群,在redis主节点发生意外宕机时没有机制来保证主从节点数据的一致性.但是,很 ...

  9. Redis单机数据迁移至Sentinel集群

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

随机推荐

  1. CodeForces 416D (贪心)

    Problem Population Size 题目大意 给一个长度为n的序列,由 -1 和正整数组成,-1表示任意的正整数. 将序列分成若干段,使得任意段都是等差数列,求最少段数. 解题分析 可以发 ...

  2. 基于linux运用python开发知识点滴

    我是小白,希望我的文章能对小白们有点作用. A.Linux的开源,优势明显,如何使用,基本命令如下: 个人认为最基础的两种操作: 1.文件操作: ls 看文件夹下内容 ls -a 隐藏文件 -l非隐藏 ...

  3. vs2012后设置显示行号结果整个窗口都变成黑色了,怎么变回来

  4. Math中floor,round和ceil的区别

    floor 返回不大于的最大整数 round 则是4舍5入的计算,入的时候是到大于它的整数(当-1.5时可见,四舍五入后得到的结果不是我们期待的,解决办法是先对他取绝对值,然后在用round方法) r ...

  5. C# 扩展方法 总结

    扩展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中. 设计一个Money类 public class Money { private decimal amount; public dec ...

  6. 弹出层是iframe引入的页面,如果用js进行隐藏呢?

    <script> $(document).ready(function(){ $('.bjfh').click(function(){ parent.document.getElement ...

  7. 1-3-1 关于API

    主要内容:API函数及其相关内容的介绍.Windows编程相关基础知识介绍 1.API函数的概念 <1>API(Application Programming interface),即应用 ...

  8. scala言语基础学习二

    使用yield和函数式编程转化数组 算法案例(移除第一个负数之后的所有负数) 改良高校方案

  9. CoderForces 280B(记忆化搜索)

    题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析: ...

  10. python课程

    课程大纲 一.语言基础(5周) 数据类型 流程控制 模块 函数.迭代器.装饰器 递归.迭代.反射 面向对象编程 模拟人生游戏开发 二.网络编程(4周) Socket c/s编程.Twisted网络框架 ...