MySQL数据快速注入到Redis

2019-10-28  本文已影响0人  菲菲非常喜羊羊

    最近遇到一个问题:业务部分重构时需要将读取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;

}

上一篇 下一篇

猜你喜欢

热点阅读