关于使用Redis的项目小坑

今天刚接受一个公司的抽奖活动的小项目,其中涉及到一个redis的问题,我们知道redis命令在使用的时候最多的就是返回0或者1或者其他的比如(nil),今天排查了好久,就是一个关于从redis里面拿用户唯一标志的,之前的人再写代码的时候不小心用了Long的equlas()方法,用一个等于1的Long去和返回redis命令的返回结果比较,导致最后一直返回false,从redis数据库里面也是没有这个key,导致问题一直定位在redis缓存没有及时同步上,项目有很赶着实很苦逼。下面附上代码供自己反思:

 public boolean getOpenId(final String key){
        JedisCallable 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定位的失误会白白花费很多时间。

你可能感兴趣的:(关于使用Redis的项目小坑)