redis的pipeline機制解析與注意事項
阿新 • • 發佈:2018-12-25
redis的pipeline機制
主要的兩個底層函式:
1.redisvAppendCommand將命令拷貝到context的obuf裡
2.redisGetReply:
1)從reply佇列裡面返回最前面的reply,如果佇列為空,繼續後面的操作
2)如果發現obuf中有資料沒有傳送,那麼傳送cmd
3)等待回包(server會把cmd中所有的處理做完,然後回包,appand過幾次,server就會返回幾個reply);收到回包後,redisGetReply裡面解析回包為reply(可能為多個,具體數量跟appand次數相同);然後返回最前面的reply
實現剖析:
1.非pipeline模式直接呼叫redisCommand也是變成redisvAppendCommand + __redisBlockForReply(redisGetReply)
2.pipeline模式就是N次redisvAppendCommand + N次redisGetReply
癥結所在:
redisGetReply是純粹的client行為,server並不知道。如果呼叫的appand次數與getreply次數不匹配,會引起混亂。
如果多呼叫了redisGetReply,那麼就會直接block
拋磚引玉:
為了不讓多一次的redisGetReply導致整個程式block掛住,可以修改hiredis的redisGetReply的實現:如果replylist為空並且outbuf中也沒有資料的時候,直接返回資料為空的reply