今天刚接受一个公司的抽奖活动的小项目,其中涉及到一个redis的问题,我们知道redis命令在使用的时候最多的就是返回0或者1或者其他的比如(nil),今天排查了好久,就是一个关于从redis里面拿用户唯一标志的,之前的人再写代码的时候不小心用了Long的equlas()方法,用一个等于1的Long去和返回redis命令的返回结果比较,导致最后一直返回false,从redis数据库里面也是没有这个key,导致问题一直定位在redis缓存没有及时同步上,项目有很赶着实很苦逼。下面附上代码供自己反思:
public boolean getOpenId(final String key){
JedisCallable<Boolean> call = new JedisCallable(){
@Overrid
public Boolean callable(Jedis instance){
Long flag = 1;
int i = instance.Hget(key);
if(flag.equals(i)){
return true;
}
return false;
}
}
}
我们进入源码可以发现:Long的equals方法是这样子的
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
很坑爹吧。这种问题一般很容易就被忽略了,尤其实在测试的时候一个小小的忽略,导致bug定位的失误会白白花费很多时间。