predis與phpRedis是php連接redis最常用的兩個(gè)包。在工作項(xiàng)目中榴啸,由于十分依賴redis导梆,因此比較predis與phpRedis兩者之間的性能差異。
寫在前面
- 測(cè)試所用代碼地址-github
- 測(cè)試環(huán)境
1.redis: Redis server v=2.9.11
2.php: PHP 7.1.29 (cli) (需安裝 PHPRedis 擴(kuò)展)
3.機(jī)器信息:Mac i5 8G內(nèi)存
單機(jī)測(cè)試
分別順序執(zhí)行5W次redis寫命令控妻,比較他們的時(shí)間(ms)州袒。
雖有一定差別,但差別不大弓候。
次數(shù) | predis | phpRedis |
---|---|---|
5w | 3000 | 2999 |
5w | 3000 | 3000 |
10w | 6000 | 6000 |
10w | 5001 | 5999 |
50w | 34999 | 33001 |
50w | 32000 | 28999 |
并發(fā)測(cè)試
寫API,讀寫一定量key,統(tǒng)計(jì)時(shí)間郎哭。并使用ab并發(fā)測(cè)試,比較兩者區(qū)別菇存。
總次數(shù) | 并發(fā)數(shù) | 讀寫數(shù) | predis | phpRedis | 備注 |
---|---|---|---|---|---|
1000 | 100 | 2000 | 333968 | 309012 | redis變卡,可能有大量等待 |
5000 | 100 | 200 | 203008 | 201993 | redis變卡,可能有大量等待 |
5000 | 50 | 200 | 234967 | 177043 | 差距變大 |
5000 | 100 | 20 | 25002 | 14007 | 差距繼續(xù)擴(kuò)大,猜測(cè)phpredis 在建立連接可能更快 |
5000 | 100 | 20 | 20996 | 13003 | 同上 |
5000 | 100 | 2 | 7000 | 4999 | |
5000 | 100 | 2 | 10002 | 4999 | |
5000 | 100 | 1 | 10996 | 2001 | 基本確定是建立連接 耗時(shí)差距 |
5000 | 100 | 1 | 7999 | 2001 |
// 隨機(jī)建立連接
$t = rand(0,1);
if ($t == 0) {
$this->testRedis(new phpRedisConn());
}else{
$this->testRedis(new PredisConn());
}
// 測(cè)試代碼
private function testRedis(conn $conn)
{
$mode = $conn->getMode();
$startTime = Comm::getMillisecond();
Comm::PrintEcho("string 測(cè)試開始..." . "當(dāng)前時(shí)間:" . $startTime . " 測(cè)試方式:" . $mode);
for ($i = 0; $i < self::NUM; $i++)
{
$conn->set($conn->getMode(), $i);
}
$endTime = Comm::getMillisecond();
$useTime = $endTime - $startTime;
$conn->incrby("useTime_" . $mode, $useTime);
Comm::PrintEcho("string 測(cè)試結(jié)束..." . "消耗時(shí)間:" . $useTime . " 測(cè)試方式:" . $mode);
}
復(fù)用連接
phpRedis較predis還有一個(gè)有點(diǎn)夸研,就是phpredis實(shí)現(xiàn)了pconnect()。pconnect在redis結(jié)束后依鸥,不會(huì)銷毀redis連接亥至,直到空閑超時(shí)自動(dòng)斷開。pconnect是依賴與php-fpm進(jìn)程的贱迟,進(jìn)程不死姐扮,connect就會(huì)存在。
/*
* $host redis IP $port redis 端口
* $timeout 默認(rèn)無限(進(jìn)程銷毀或者redis超時(shí)斷開)
* $persistent_id 連接標(biāo)示 新的標(biāo)示 建立新連接
*/
public function pconnect( $host, $port = 6379, $timeout = 0.0, $persistent_id = null )
// 加入新的連接方式
$t = rand(0,2);
if ($t == 0) {
$this->testRedis(new phpRedisConn());
}elseif ($t == 1)
{
$this->testRedis(new PredisConn());
}elseif ($t == 2)
{
$this->testRedis(new phpRedisPconn());
}
總次數(shù) | 并發(fā)數(shù) | 讀寫數(shù) | predis | phpRedis | phpRedisPconn | 備注 |
---|---|---|---|---|---|---|
5000 | 100 | 200 | 70982 | 64999 | 62002 | 與上面時(shí)間因?yàn)閳?zhí)行次數(shù)有差別 三者對(duì)比即可 |
5000 | 50 | 200 | 62985 | 42004 | 52021 | 這種方案下,connect更快~ |
5000 | 50 | 200 | 74992 | 52001 | 54997 | 又測(cè)試了一次 |
5000 | 100 | 20 | 8997 | 7007 | 9997 | 好奇怪~ |
5000 | 100 | 20 | 10999 | 7997 | 11995 | |
5000 | 100 | 2 | 5996 | 4004 | 4996 | |
5000 | 100 | 2 | 5000 | 4998 | 2000 | |
5000 | 100 | 1 | 5000 | 4999 | 1999 | |
5000 | 100 | 1 | 4001 | 2999 | 3997 | |
5000 | 100 | 1 | 7001 | 4996 | 2001 | 猜測(cè)是不是跟fpm銷毀有關(guān),增加并發(fā)總次數(shù)(并且修改每次計(jì)算毫秒的小數(shù)點(diǎn)位數(shù) 5位) |
15000 | 100 | 1 | 11995 | 5997 | 5007 | 有差距衣吠,但差距不大 |
15000 | 100 | 1 | 11995 | 8005 | 7000 |
在測(cè)試中茶敏,當(dāng)高并發(fā)時(shí),pconnect 可能會(huì)又更好的效果缚俏,但是并發(fā)低的話惊搏,connect會(huì)更快一些贮乳。
另外,pconnect連接數(shù)是和fpm數(shù)目相關(guān)聯(lián)的胀屿。
參考文章:
高并發(fā)下PHP請(qǐng)求Redis異常處理
phpredis中的connect和pconnect
史上最LOW的PHP連接池解決方案
請(qǐng)手動(dòng)釋放你的資源
深入php redis pconnect