pipeline 管道
一般情況下,Redis Client端發(fā)出一個(gè)請(qǐng)求后,通常會(huì)阻塞并等待Redis服務(wù)端處理,Redis服務(wù)端處理完后請(qǐng)求命令后會(huì)將結(jié)果通過響應(yīng)報(bào)文返回給Client。
通過pipeline方式當(dāng)有大批量的操作時(shí)候,我們可以節(jié)省很多原來浪費(fèi)在網(wǎng)絡(luò)延遲的時(shí)間,需要注意到是用pipeline方式打包命令發(fā)送,
redis必須在處理完所有命令前先緩存起所有命令的處理結(jié)果。打包的命令越多,緩存消耗內(nèi)存也越多。所以并不是打包的命令越多越好。
Redis Pipelining可以一次發(fā)送多個(gè)命令,并按順序執(zhí)行、返回結(jié)果,節(jié)省RTT(Round Trip Time)。
pipeline使用建議
Pipeline雖然好用,但是每次Pipeline組裝的命令個(gè)數(shù)不能沒有節(jié)制,否則一次組裝Pipeline數(shù)據(jù)量過大,一方面會(huì)增加客戶端的等待時(shí)間,另一方面會(huì)造成一定的網(wǎng)絡(luò)阻塞,可以將一次包含大量命令的Pipeline拆分成多次較小的Pipeline來完成
原生批量命令與Pipeline對(duì)比
可以使用Pipeline模擬出批量操作的效果,但是在使用時(shí)要注意它與原生批量命令的區(qū)別,具體包含以下幾點(diǎn):
-- 原生批量命令是原子的,Pipeline是非原子的。
-- 原生批量命令是一個(gè)命令對(duì)應(yīng)多個(gè)key,Pipeline支持多個(gè)命令。
-- 原生批量命令是Redis服務(wù)端支持實(shí)現(xiàn)的,而Pipeline需要服務(wù)端和客戶端的共同實(shí)現(xiàn)。
Transaction
同一個(gè)redis client發(fā)送命令MULTI表示準(zhǔn)備執(zhí)行事務(wù),同時(shí)發(fā)送的命令會(huì)在server端排隊(duì),期間不影響其他客戶端發(fā)送命令,服務(wù)器不會(huì)阻塞,該客戶端發(fā)送EXEC,服務(wù)器端把執(zhí)行完的結(jié)果一起發(fā)送給客戶端。如果同一個(gè)Transaction中的命令太多,服務(wù)器會(huì)阻塞。(也就是在事務(wù)執(zhí)行期間,服務(wù)器不會(huì)執(zhí)行其他命令)
pipeline、Transaction對(duì)比
pipeline關(guān)注的是RTT時(shí)間,而transaction關(guān)注的是一致性
-- pipeline: 一次請(qǐng)求,服務(wù)端順序執(zhí)行,一次返回。
-- transaction: 多次請(qǐng)求(MULTI命令+其他n個(gè)命令+EXEC命令,所以至少是2次請(qǐng)求),服務(wù)端順序執(zhí)行,一次返回。
-- 集群模式下,使用pipeline時(shí),slot必須是對(duì)的,不然服務(wù)端會(huì)返回redirecred to slot xxx的錯(cuò)誤;不建議使用Transaction,因?yàn)榧僭O(shè)一個(gè)Transaction中的命令即在Master A上執(zhí)行,也在Master B執(zhí)行,A成功了,B因?yàn)槟撤N原因失敗了,這樣數(shù)據(jù)就不一致了,這個(gè)有點(diǎn)類似于分布式事務(wù),無法保證絕對(duì)一致性。