鍍金池/ 問答/人工智能  PHP  網(wǎng)絡(luò)安全/ 如何向redis快速插入大量數(shù)據(jù)

如何向redis快速插入大量數(shù)據(jù)

現(xiàn)在用循環(huán)效果不是很好,數(shù)據(jù)量三萬多條時,就要兩秒多的插入時間,有沒有一種批量插入大量數(shù)據(jù)的方法
之前我是用這樣的方法

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

效果并不是很好

回答
編輯回答
編輯回答
氕氘氚

@elarity 之前確實沒有注意到過PHP的這個關(guān)鍵字,thinks

我就強行答一個其他的方法吧

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

目的是為了對多個命令進行打包,多次網(wǎng)絡(luò)請求合并成單次。

$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的性能優(yōu)于for

2018年3月15日 17:26
編輯回答
傲嬌范

pipe執(zhí)行或者用redis執(zhí)行腳本lua,在lua里實現(xiàn)批量插入的程序

2017年3月12日 01:18
編輯回答
賤人曾

你看下我圖中的代碼 , 第一張圖是代碼 , 第二張是運行結(jié)果 .
可以參考下 .
圖片描述

圖片描述

然后是我得做幾條補充說明 :

  1. 我是在php cli下測試的 , 該腳本從頭到尾只連接了redis一次 , 一直到最終腳本執(zhí)行完畢釋放連接 .

  2. ... 是php 5.6新加入的特性 , 你可以搜php 5.6不定參數(shù)關(guān)鍵字 .

  3. 我只針對單個key進行操作 , 而樓主似乎是需要對不同的key進行操作 .

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

我再補充下 , 原來之前 , 我還用過如下方法 :
關(guān)鍵字 call_user_func_array()

2018年5月18日 22:21
編輯回答
懶豬

半年前我在實現(xiàn)批量插入的時候,也是用官方文檔中的mass-insert的。
從txt里讀內(nèi)容,然后生成供redis批量插入的語句,寫入一個文件。
然后再用命令行調(diào)用插入命令來批量插入。(或者說批量執(zhí)行指令)

2017年1月10日 02:58
編輯回答
心沉

用隊列?。?br>(服務(wù)提供者,消費者)
步驟: 把數(shù)據(jù) 用JSON 格式存入 緩存(消費者),由服務(wù)提供者(另一個進程) 去操作這些數(shù)據(jù)

這樣就不會占用當(dāng)前進程,你就直接反饋給頁面 加入任務(wù)中

我就是這么干的

2017年1月10日 01:25
編輯回答
悶騷型

這是由于Redis是一個 請求/響應(yīng) 式服務(wù)器決定的,試試 Pipeline

2017年10月19日 07:57