zoukankan      html  css  js  c++  java
  • php读取文件使用redis的pipeline(管道)导入大批量数据

    需求:需要做一个后台上传TXT文件,读取其中的内容,然后导入redis库中。要求速度快,并且支持至少10W以上的数据,而内容也就一个字段存类似openid和QQ

    传统做法:我一开始做的时候就老套路,遍历、hset,然后就发现非常的慢,一千条数据就花了30-32秒,当时就觉得不行,于是就请教了一个大佬,然后就得知了方法

    我生成了20W的数据用来做测试,文件大小6M多。

    话不多说,直接贴代码了大笑

    $lines  = file_get_contents($_FILES['file']['tmp_name']);//获取文件内容
    ini_set('memory_limit', '-1');//不要限制Mem大小,否则会报错
    $line   = explode(" ",$lines);//转换成数组
    //实例化redis
    $redis = new Redis();
    //连接
    $redis->connect('127.0.0.1', 6379);
    $redis->pipeline();//开启管道
    if(!$redis){
        throw new Exception('redis连接失败!',1);
    }
    $key   = $info['key'];
    $c     = 0;
    $count = count($line);
    $now   = time();
    for($i=0;$i<$count;$i++){
        $res = $redis->hset($key,$line[$i],1);
        if($res){
            $c ++;
        }
    }
    $redis->exec();

    使用结果:

    哈哈,即使就直接用time()方法获取的,是计秒的,没有毫秒那种效果,不过也可以看出来确实是非常的快,20W的数据不到两秒就存进去了

    其实整个代码都非常简单,能让redis快速导入的就是一个点“pipeline”,开启了这个就可以了。哈哈以前没有用过,所以就小小的记录一下。

  • 相关阅读:
    通用数据级权限控制解决方案的实现(二)(转)
    linux copy file to window
    日历 存储过程
    ssas 日期 时间维度表 sql 代码
    Dynamic CRM常用代码记录
    跨服务器查询sql (摘要)
    验证码实现
    office文档转pdf
    页面导出生成pdf,使用wkhtmltopdf第三方工具
    iTextSharp简单生成pdf和操作pdf添加水印
  • 原文地址:https://www.cnblogs.com/songadmin/p/10783146.html
Copyright © 2011-2022 走看看