最近遇到一个问题:业务部分重构时需要将读取MySQL表内存储的数据转化为读取Redis数据,需要在正式上线前将已有的MySQL表数据注入到Redis内,表数据为400W+;尝试了PHP脚本导入与redeis-cli --pipe管道导入
redeis-cli --pipe管道导入
执行命令
mysql -u用户名 -p密码 -D数据库名 --default-character-set=utf8 --skip-column-names --raw <mysql_to_redis.sql redis-cli -h 127.0.0.1 -p 6379 –-pipe
--default-character-set=utf8 :编码设置
--skip-column-names:不显示列名
--raw:原生输出,不做任何转义
创建文件mysql_to_redis.sql内容如下
SELECT CONCAT(
"*3\r\n",
'$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',
'$',LENGTH(redis_key),'\r\n',redis_key,'\r\n',
'$',LENGTH(hval1),'\r\n',hval1,'\r'
)FROM(
SELECT 'SET' AS redis_cmd,
CONCAT_WS('_','number', uid) AS redis_key,
json_object('uid' ,uid,'uname', uname,'age', age,'job' , job) as hval1
FROM user limit 1
)AS a
以上sql语句为组装以下命令
*3 //*3代表下面三个数据,如果是其他形式的语句数字对应数据个数
$3 //set命令字符长度
set
$8 //number_1key字符长度
number_1
$66 //value字符长度
"{\"uid\":100, \"uname\": 100, \"age\": 12, \"gob\": \"student\"}"
tips
'\r\n'是linux下的格式,window下注意修改为相应格式
json_object 函数mysql5.7以上可用,其他版本注意数据组装
php脚本插入
大量数据处理时比较耗时,不建议使用
<?php
/**
* Desc: 数据注入到redis
*/
ini_set('memory_limit','1024M');//设置运行内存
ini_set("max_execution_time", 0);//设置运行时间
//redis配置
$redis_config = array(
'host' => '127.0.0.1',
'port' => 6379,
'timeout' => 300,
);
$redis = redis_link($redis_config);
//mysql配置
$mysql_config = array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => 'root',
'dbname' => 'db',
);
$db = mysql_link($mysql_config);
$start = 0;//查询起点
$num = 1000;//mysql每次查询条数
//数据操作
echo "start:".time();
do{
$sql = 'select * from user limit '.$start.' , '.$num;
$data = $db->query($sql);
if ($data->num_rows > 0) {
while ($row = $data->fetch_assoc()) {
$redis->set('number_'.$row['uid'], json_encode($row),2592000);
}
}
$start += $num;
} while($data->num_rows > 0);
echo "end:".time();
//redis连接
function redis_link($config = array())
{
if (!extension_loaded('redis')) {
die("Redis扩展不存在");
}
$conn = new Redis();
$conn -> connect($config['host'],$config['port'],$config['timeout']);
return $conn;
}
//mysql连接
function mysql_link($config = array())
{
if (!extension_loaded('mysqli')) {
die("mysqli扩展不存在");
}
$conn = @new mysqli($config['host'], $config['username'], $config['password'], $config['dbname']);
if ($conn->connect_errno) {
die("could not connect to the database:\n" . $conn->connect_error);
}
$conn->query("set names 'utf8';");
return $conn;
}
网友评论