本文是基于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万数据成功。

go Redis批量写入 redis批量写入到mysql_redis

步骤二:利据库客户端或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,下图中可以看到已经成功导入目标数据:

go Redis批量写入 redis批量写入到mysql_数据库_02