现象
在多个线程通过同一个连接给redis-server发送命令时,会有概率出现某个线程发送的命令接收不到的情况
问题分析
调用redisCommand函数会通过redisGetReply获取命令结果,而redisGetReply会直到recv返回空才会返回,所以,当一个线程调用redisGetReply时,另一个线程的结果刚好也返回,那么本线程的redisGetReply会把所有命令结果全部读取出来,等另一个线程再调用redisGetReply时,就获取不到结果了。
解决方法
在多线程对同一个redis连接调用redisCommand函数时加上一个同步锁,这就避免出现一个线程发送的命令被其他线程获取的问题