使用Redis Pipeline管道技术,批量导入Redis 500万条记录(借助Mysql生成csv文件)

2 篇文章 0 订阅
2 篇文章 0 订阅

本文是基于Python2.7.5版本写的shell脚本,目的是在CentOS7.3上执行Redis Pipeline管道操作命令,以批量导入Redis 500万条记录,中间借用了Mysql的Stored Procedure生成500万数据,并导出到csv文件,供Python脚本调用,下面是详细操作步骤。

目录

步骤一:创建Mysql存储过程

步骤二:利据库客户端或Mysql命令行导出csv文件

步骤三:创建执行导入Redis的Python脚本

步骤四:使用Python脚本批量导入500万数据到Redis中



步骤一:创建Mysql存储过程

在Mysql5.7上创建一个Stored Procedure,在表demo_data中导入Mysql模拟的500万条记录

登陆Mysql:

Mysql -hlocalhost -uroot -p

登陆成功后,切换到要导入数据的数据库实例。

然后,创建表demo_data:

CREATE TABLE `demo_data` (

  `key` varchar(20) DEFAULT NULL,

  `value` varchar(20) DEFAULT NULL,

  `numbers` int(11) DEFAULT NULL,

  UNIQUE KEY `key_UNIQUE` (`key`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

再执行下面的Mysql创建存储过程语句,以批量导入表demo_data:

-- DROP PROCEDURE `demo_data_procedure`;

DELIMITER //

CREATE PROCEDURE `demo_data_procedure`(IN n int)

BEGIN

  DECLARE i INT DEFAULT 1;

    WHILE (i <= n ) DO

      INSERT INTO demo_data VALUES(concat('key_', i), concat('value_', i), i);

            SET i = i+1;

    END WHILE;

END

//

DELIMITER ;

创建成功存储过程,调用此存储过程,进行数据插入:

call demo_data_procedure(5000000);

根据本机性能,执行等待大概1~3分钟左右,插入demo_data表500万数据成功。

步骤二:利据库客户端或Mysql命令行导出csv文件

利用Navicat for Mysql数据库客户端,导出文件temp500W.csv文件到本地。

或者用mysql命令行导出文件temp500W.csv(具体导出命令见下面步骤四中的第1步)。

步骤三:创建执行导入Redis的Python脚本

在CentOS7上创建shell脚本文件initData.py,脚本如下(注意:此处是基于CentOS7自带的Python2.7.5版本写的脚本,在Python3.6+以上需要修改print语句,即可执行):

#!/usr/bin/env python

# -*- coding: utf-8 -*-

 

import os

import sys

import pymssql

import redis

import time

 

redis_ip = "127.0.0.1"

redis_port = 6379

redis_passwd = "123456"

 

def import_redis_data():

    rpool = redis.ConnectionPool(host = redis_ip, port = redis_port, db = 0, password = redis_passwd)

    redis_cli = redis.Redis(connection_pool=rpool)

    pipeline_redis = redis_cli.pipeline(transaction=False)

    count = 0

    

    # sys.argv[1]: 这是输入的第一个参数,表示的是你的csv文件的全路径,而第0个参数是python关键字后面的这个“initData.py”文件名

    file_name = sys.argv[1]

    f = open(file_name)

    file_content = f.readlines()

 

    cmd_list = []

    for single_line in file_content:

        value ,uid, val_str = single_line.strip('\n').split(‘,')

        val = int(val_str)

        key = "KEY_%s" % uid

        count += 1

        pipeline_redis.hset(key, value, val)

        #cmd_list.append([key, value, val])

        if count % 250000 == 0:

            result = pipeline_redis.execute()

            # print result

    result = pipeline_redis.execute()

    print result

 

if __name__ == '__main__':

    import_redis_data()

步骤四:使用Python脚本批量导入500万数据到Redis中

接下来,要调用上面第二步中的python脚本,通过redis的pipeline管道技术,批量导入到本机的Redis中:

下面是在CentOS7上执行的步骤:

第1步,将完整的Redis命令写入文本之中,如通过MySQL将数据拼成Redis命令,并生成文本,这里是用Redis的hset哈希表的数据结构存储数据:

mysql -h127.0.0.1 -P3306 -uroot -pxxxx -e "select concat_ws(' ','hset',key,value,numbers) from demo_data;">> temp500W.csv

第2步,通过redis-cli —pipe导入,注意:这里的/tmp/temp500W.csv需要替换成自己的实际路径

python initData.py /tmp/temp500W.csv | redis-cli -h 127.0.0.1 -p 6379 -a test --pipe

第3步,通过redis-cli客户端连接Redis server,查看Redis是否导入成功500W的key,下图中可以看到已经成功导入目标数据:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值