1 問(wèn)題:如何優(yōu)化頻繁命令往返造成的性能瓶頸呢蔫?
- Redis是一種基于客戶端-服務(wù)端模型以及請(qǐng)求/響應(yīng)協(xié)議的TCP服務(wù)难咕。
- 一個(gè)請(qǐng)求會(huì)遵循以下步驟:
- 1客戶端向服務(wù)端發(fā)送命令分四步(發(fā)送命令→命令排隊(duì)→命令執(zhí)行-返回結(jié)果)岖赋,并監(jiān)聽(tīng)Socket返回咧欣,通常以阻塞模式等待服務(wù)端響應(yīng)完域。
- 2服務(wù)端處理命令赘来,并將結(jié)果返回給客戶端栏渺。 上述兩步稱為: Round Trip Time(簡(jiǎn)稱RTT,數(shù)據(jù)包往返于兩端的時(shí)間)呛梆。
- 如果同時(shí)需要執(zhí)行大量的命令,那么就要等待上一條命令應(yīng)答后再執(zhí)行
- 這中間不僅僅多了RTT (Round Time Trip) 磕诊,而且還頻繁調(diào)用系統(tǒng)IO填物, 發(fā)送網(wǎng)絡(luò)請(qǐng)求,同時(shí)需要redis調(diào)用多次read()和write()系統(tǒng)方法霎终, 系統(tǒng)方法會(huì)將數(shù)據(jù)從用戶態(tài)轉(zhuǎn)移到內(nèi)核態(tài)滞磺,這樣就會(huì)對(duì)進(jìn)程上下文有比較大的影響了,性能不太好
2 管道是什么:
- 管道(pipeline)可以一次性發(fā)送多條命令給服務(wù)端莱褒,服務(wù)端依次處理完畢后击困,通過(guò)一 條響應(yīng)一次性將結(jié)果返回,通過(guò)減少客戶端與redis的通信次數(shù)來(lái)實(shí)現(xiàn)降低往返延時(shí)時(shí)間广凸。
- pipeline實(shí)現(xiàn)的原理是隊(duì)列阅茶,先進(jìn)先出特性就保證數(shù)據(jù)的順序性。
- 批處理命令變種優(yōu)化措施谅海,類似Redis的原生批命令(mget和mset)
3 實(shí)踐
cat cmd.txt | redis-cli --pipe
4 注意事項(xiàng)
- 事務(wù)具有原子性脸哀,管道不具有原子性
- 執(zhí)行事務(wù)時(shí)會(huì)阻塞其他命令的執(zhí)行,而執(zhí)行管道中的命令時(shí)不會(huì)