redis 使用管道提升寫入的效能[pipeline]
阿新 • • 發佈:2018-11-11
看了手冊的都知道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