1. 程式人生 > >redis 使用管道提升寫入的效能[pipeline]

redis 使用管道提升寫入的效能[pipeline]

看了手冊的都知道multi這個命令的作用就好比是mysql的事務的功能,但是大家都知道事務嗎,就是在操作的過程中,把整個操作當作一個原子來處理,避免由於中途出錯而導致最後產生的資料不一致,而產生BUG ,Mysql的事務功能可以做到這點,但是在redis中的multi,手冊中說是把多個命令當作個事務來處理,但是在真正的測試之後發現並沒有所說的事務的功能,個人經過測試發現,只有把他watch命令結合起來用,方可顯現出其具有事務的功能,所以這點很是迷惑,關鍵是有一點很詫異,當啟用了multi命令之後整個redis的讀寫會相對於沒有使用multi的的讀寫要慢一點,我通過讀寫100W條資料發現,他們的速度相差600多毫秒,搞不清楚為什麼相差這麼多!個人覺得沒有必要,還是不要使用這個multi的為好!
至於redis的pipeline命令,看手冊都知道,它能夠讓(多條)執行命令簡單的,更加快速的傳送給伺服器,但是沒有任何原子性的保證,能不能保證原子性這個我沒有測試,但是這個速度我測試了下,確實是吃了一驚啊!相比於沒有使用pipeline的讀寫操作,使用了pipeline命令的操作要快12倍不止啊!這個效率高的。。。。
下面是我的測試程式碼:歡迎拍磚。

複製程式碼

<?php

set_time_limit(0);

//計時函式
function G($start,$end='',$dec=4)
{
    static $_info = array();
    if (!empty($end))
    {
        if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
        $sconds = number_format(($_info[$end]-$_info[$start]), $dec) * 1000;
        echo "{$sconds}ms<br />";
    }
    else
    {
        $_info[$start] = microtime(TRUE);
    }
}

$redis = new Redis();
$redis->connect('127.0.0.1');

G('t');
$redis->pipeline();
for ($i=0; $i < 100000 ; $i++) { 
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get('test_{$i}');
}
$redis->exec();
G('t','r');

G('m');
$redis->multi();
for ($i=0; $i < 100000 ; $i++) { 
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get('test_{$i}');
}
$redis->exec();
G('m','i');

$redis->flushdb();

G('f');
for ($i=0; $i < 100000 ; $i++) { 
   $redis->set("test_{$i}", pow($i, 2));
   $redis->get('test_{$i}');
}
G('f','e');

?>

複製程式碼

這是返回的結果:
//pipeline的執行時間
1926.5ms
//multi的執行時間
27725.7ms
//正常情況下
24832.1ms

來源:https://www.cnblogs.com/hgj123/p/4646298.html