先抱怨一波,大国庆节的放假前一天的下班前15分钟,通知让我加班,因为一个Redis的bug,而这个bug我在1个半小时之前刚听说了个大概,心里很不情愿;
好了,说正事;
问题现象:
bug是这样的,两个线程同时请求Redis服务器,但是只有一个线程收到了回复,另一个线程卡死;
拿到这个问题,我先是想了想到底怎么查,于是想了可能出问题的位置,然后怎么通过日志和数据对比的方式确定问题出在哪个部分;
下班了,赶紧去赶班车;
坐在班车上就一直在想到底是哪里的问题,想了一会儿突然反应过来,总结了一下;
问题分析:
redis是客户端-服务器模型,我们现在虽然在客户端开启了两个线程,但是这两个线程共用了同一个socket;
从服务器的角度来看,它看到的是客户端给我发来了数据,但是它根本不知道你客户端什么线程不线程的,它只知道收到了连续一串的命令,所以它处理完数据之后给客户端回复了一个reply,完事;
这样两个线程只有一个线程收到了回复,另外一个线程阻塞;
解决办法:
确保每个线程都拥有一个独立的socket与服务器进行通信;当然,加锁也可以,但我觉得没必要在客户端就给串行了;
这个方案提给了同事,自己很有信心,弄好就不用过去加班了,全程一个小时,刚好下班车回家,心情阴转晴;