摘要:服務(wù)端處理命令,并將結(jié)果返回給客戶端。這樣的連接可能非??煸谝粋€(gè)回路網(wǎng)絡(luò)中,也可能非常慢在廣域網(wǎng)上經(jīng)過(guò)多個(gè)結(jié)點(diǎn)才能互通的兩個(gè)主機(jī)。
前言
Redis使用的是客戶端-服務(wù)器(CS)模型和請(qǐng)求/響應(yīng)協(xié)議的TCP服務(wù)器。這意味著通常情況下一個(gè)請(qǐng)求會(huì)遵循以下步驟:
(1)客戶端向服務(wù)端發(fā)送一個(gè)查詢請(qǐng)求,并監(jiān)聽(tīng)Socket返回,通常是以阻塞模式,等待服務(wù)端響應(yīng)。 (2)服務(wù)端處理命令,并將結(jié)果返回給客戶端。
客戶端和服務(wù)端通過(guò)網(wǎng)絡(luò)進(jìn)行連接。這樣的連接可能非??欤ㄔ谝粋€(gè)回路網(wǎng)絡(luò)中),也可能非常慢(在廣域網(wǎng)上經(jīng)過(guò)多個(gè)結(jié)點(diǎn)才能互通的兩個(gè)主機(jī))。
但是無(wú)論是否存在網(wǎng)絡(luò)延遲,數(shù)據(jù)包從客戶端傳輸?shù)椒?wù)端,以及客戶端從服務(wù)端獲得響應(yīng)都需要花費(fèi)一些時(shí)間。這段時(shí)間就稱為往返時(shí)延(Round Trip Time)。
因此當(dāng)客戶端需要執(zhí)行一串請(qǐng)求的時(shí)候,很容易看出它對(duì)性能的影響(例如往同一個(gè)隊(duì)列中加入大量元素,或者往數(shù)據(jù)庫(kù)中插入大量的鍵)。如果RTT時(shí)長(zhǎng)為250毫秒(在基于廣域網(wǎng)的低速連接環(huán)境下),即使服務(wù)器每秒可以處理10萬(wàn)個(gè)請(qǐng)求,但是實(shí)際上我們依然只能每秒處理最多4個(gè)請(qǐng)求。
如果處于一個(gè)回路網(wǎng)絡(luò)中,RTT時(shí)長(zhǎng)則相當(dāng)短(我的主機(jī)ping 127.0.0.1時(shí)只需要0.063ms),但是如果你執(zhí)行一大串寫(xiě)入請(qǐng)求的時(shí)候,還是會(huì)有點(diǎn)長(zhǎng)。
如果需要一次執(zhí)行多個(gè)redis命令,以往的方式需要發(fā)送多次命令請(qǐng)求,由redis服務(wù)器依次執(zhí)行,并返回結(jié)果。
為了解決此類問(wèn)題,設(shè)計(jì)者設(shè)計(jì)出了redis管道命令:客戶端可以向服務(wù)器發(fā)送多個(gè)請(qǐng)求,而不必等待回復(fù),并最終在一個(gè)步驟中讀取回復(fù)返回給客戶端,從而大大增加了協(xié)議性能。
pipeline在php中的應(yīng)用管道的開(kāi)啟方式最主要是一條命令:$redis->pipeline()
批量給一個(gè)list類型的key添加10w條數(shù)據(jù),實(shí)例如下:
connect("127.0.0.1", 6379); $redis->auth("******"); $redis->select(0); $redis->pipeline();//開(kāi)啟管道 //假設(shè)變量$data數(shù)組有10w條數(shù)據(jù),批量添加到list類型中 $data = array(1,2,3,...,100000); $key = "list1"; foreach($data as $value){ $redis->rpush($key,$value); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29596.html
摘要:首發(fā)于樊浩柏科學(xué)院的管道是用來(lái)打包多條無(wú)關(guān)命令批量執(zhí)行,以減少多個(gè)命令分別執(zhí)行帶來(lái)的網(wǎng)絡(luò)交互時(shí)間。在一些批量操作數(shù)據(jù)的場(chǎng)景,使用管道可以顯著提升的讀寫(xiě)性能。這時(shí),可以使用管道實(shí)現(xiàn),也可以內(nèi)嵌腳本實(shí)現(xiàn)。 首發(fā)于 樊浩柏科學(xué)院 Redis 的 管道 (pipelining)是用來(lái)打包多條無(wú)關(guān)命令批量執(zhí)行,以減少多個(gè)命令分別執(zhí)行帶來(lái)的網(wǎng)絡(luò)交互時(shí)間。在一些批量操作數(shù)據(jù)的場(chǎng)景,使用管道可以顯著...
摘要:連接提供兩個(gè)類和用于實(shí)現(xiàn)的命令,用于實(shí)現(xiàn)大部分官方的命令,并使用官方的語(yǔ)法和命令,是的子類,用于向后兼容舊版本的。如果使用關(guān)系數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)點(diǎn)擊,可能存在大量的行級(jí)鎖爭(zhēng)用。 1、redis連接 redis提供兩個(gè)類Redis和StrictRedis用于實(shí)現(xiàn)Redis的命令,StrictRedis用于實(shí)現(xiàn)大部分官方的命令,并使用官方的語(yǔ)法和命令,Redis是StrictRedis的子類,用...
閱讀 1339·2023-04-25 18:57
閱讀 2261·2023-04-25 16:28
閱讀 4152·2021-11-24 09:39
閱讀 3761·2021-11-16 11:45
閱讀 1978·2021-10-13 09:40
閱讀 1339·2019-08-30 15:52
閱讀 1813·2019-08-30 10:57
閱讀 738·2019-08-29 16:55