1. 程式人生 > >redis的pipeline機制解析與注意事項

redis的pipeline機制解析與注意事項

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