天天看點

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