Redis利用管道批量插入数据

首先需要构造数据的基本格式,如命令  

hmset news105 news_title title105 news_content content105 news_views 28 

拆分成以下格式:

*8   // 按空格拆分有几段 
$5   // 代表 hmset 的字符长度
hmset
$7   // 代表 news105 的字符长度,以此类推·
news105
$10
news_title
$8
title105
$12
news_content
$10
content105
$10
news_views
$2
28

利用 MySQL 构造数据

数据表(news)结构:

利用 sql 拼接数据(news.sql):

select concat('*8','\r\n','$5','\r\n','hmset','\r\n','$',LENGTH(news_id)+4,'\r\n','news',news_id,'\r\n'
,'$10','\r\n','news_title','\r\n','$',LENGTH(news_title),'\r\n',news_title,'\r\n','$12','\r\n','news_content','\r\n'
,'$',LENGTH(news_content),'\r\n',news_content,'\r\n','$10','\r\n','news_views','\r\n','$',LENGTH(news_views),'\r\n',news_views
,'\r')
from news order by news_views desc limit 0,5

导出 sql 执行结果(news):

mysql -uroot -p123456 -D 数据库名 --skip-column-names --raw < news
  • --skip-column-names:不显示列名
  • --raw:原生输出,不做任何转义

至此,数据构造完毕。批量插入 redis:

cat news | redis-cli --pipe

查看结果:

利用 PHP 脚本构造数据

preheat.php:

<?php

$redis = new Redis();
$redis->connect('Redis服务端IP',6379);

$redis->multi(Redis::PIPELINE);
$newsPreData = getDataBySQL("select news_id,news_title,news_views from news order by news_views desc limit 0,5");

foreach($newsPreData as $row)
{
    $key="news".$row["news_id"]; // 拼接key
    // 批量插入
    $redis->hMset($key, [
        "news_id"=>$row["news_id"],
        "news_title"=>$row["news_title"],
        "news_views"=>$row["news_views"]
    ]);
    $redis->expire($key, 200);
}

$redis->exec();
echo "done...".PHP_EOL;

// 从数据库读取
function getDataBySQL(String $sql) {
    $dsn = 'mysql:host=MySQL服务端IP;dbname=redis';
    $pdo=new PDO($dsn, "root", "123456");
    $sth = $pdo->prepare($sql);
    $sth->execute();
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    return $sth->fetchAll();
}

执行该脚本:

查看结果:

 

posted @ 2018-12-14 16:54  Azure沫  阅读(2190)  评论(0编辑  收藏  举报