如何向redis快速插入大量数据

现在用循环效果不是很好,数据量三万多条时,就要两秒多的插入时间,有没有一种批量插入大量数据的方法
之前我是用这样的方法

for ($i=0; $i < count($list); $i++) 
{ 
    $redis->lpush('list',$list[$i]['phone']);
    $redis->lpush('code',$list[$i]['smscode']);  
}

效果并不是很好

阅读 5.3k
评论 更新于 2018-01-07
    7 个回答

    这是由于Redis是一个 请求/响应 式服务器决定的,试试 Pipeline

    评论 赞赏 2017-11-22
      elarity
      • 4.2k

      你看下我图中的代码 , 第一张图是代码 , 第二张是运行结果 .
      可以参考下 .
      图片描述

      图片描述

      然后是我得做几条补充说明 :

      1. 我是在php cli下测试的 , 该脚本从头到尾只连接了redis一次 , 一直到最终脚本执行完毕释放连接 .

      2. ... 是php 5.6新加入的特性 , 你可以搜php 5.6不定参数关键字 .

      3. 我只针对单个key进行操作 , 而楼主似乎是需要对不同的key进行操作 .

      4. 我操作的key是个set集合 , 而不是楼主的list .

      我再补充下 , 原来之前 , 我还用过如下方法 :
      关键字 call_user_func_array()

      评论 赞赏 2017-11-22
        评论 赞赏 2017-11-22
          foxwho
          • 5
          • 新人请关照

          用队列啊!
          (服务提供者,消费者)
          步骤: 把数据 用JSON 格式存入 缓存(消费者),由服务提供者(另一个进程) 去操作这些数据

          这样就不会占用当前进程,你就直接反馈给页面 加入任务中

          我就是这么干的

          评论 赞赏 2017-11-22

            pipe执行或者用redis执行脚本lua,在lua里实现批量插入的程序

            评论 赞赏 2017-11-23

              @elarity 之前确实没有注意到过PHP的这个关键字,thinks

              我就强行答一个其他的方法吧

              可以利用Redis的 Pipeline, 也就是管道

              目的是为了对多个命令进行打包,多次网络请求合并成单次。

              $redis = new Redis();
              $redis->connect('127.0.0.1', '6379');
              $redis->multi(Redis::PIPELINE);
              for ($i=0; $i < count($list); $i++) {
                  $redis->lpush('list',$list[$i]['phone']);
                  $redis->lpush('code',$list[$i]['smscode']);
              }
              $redis->exec();

              ps:foreach的性能优于for

              评论 赞赏 2017-12-04

                半年前我在实现批量插入的时候,也是用官方文档中的mass-insert的。
                从txt里读内容,然后生成供redis批量插入的语句,写入一个文件。
                然后再用命令行调用插入命令来批量插入。(或者说批量执行指令)

                评论 赞赏 2017-11-28
                  撰写回答

                  登录后参与交流、获取后续更新提醒