为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
Cats萌萌 2019-03-18 00:08:11
现在用循环效果不是很好,数据量三万多条时,就要两秒多的插入时间,有没有一种批量插入大量数据的方法之前我是用这样的方法 for ($i=0; $i < count($list); $i++) { $redis->lpush('list',$list[$i]['phone']); $redis->lpush('code',$list[$i]['smscode']); } 效果并不是很好
查看完整描述

7 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-03-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

你看下我图中的代码 , 第一张图是代码 , 第二张是运行结果 .
可以参考下 .
https://img1.sycdn.imooc.com//5c8f5baa0001c7a506140546.jpg

https://img1.sycdn.imooc.com//5c8f5bab0001bca304220051.jpg

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

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

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

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

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

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

查看完整回答
反对 回复 2019-03-18
?
手掌心

TA贡献1942条经验 获得超3个赞

@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

查看完整回答
反对 回复 2019-03-18
?
噜噜哒

TA贡献1784条经验 获得超7个赞

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

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

我就是这么干的

查看完整回答
反对 回复 2019-03-18
  • 7 回答
  • 0 关注
  • 2181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信