本文是基于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,下图中可以看到已经成功导入目标数据: