現象
在多個線程通過同一個連接給redis-server發送命令時,會有概率出現某個線程發送的命令接收不到的情況
問題分析
調用redisCommand函數會通過redisGetReply獲取命令結果,而redisGetReply會直到recv返回空纔會返回,所以,當一個線程調用redisGetReply時,另一個線程的結果剛好也返回,那麼本線程的redisGetReply會把所有命令結果全部讀取出來,等另一個線程再調用redisGetReply時,就獲取不到結果了。
解決方法
在多線程對同一個redis連接調用redisCommand函數時加上一個同步鎖,這就避免出現一個線程發送的命令被其他線程獲取的問題