定位原因:
代码1:database 0用于 mybatis二级缓存,实现了mybats的Cache接口
代码2:database 1用于 保存邮件/手机 验证码,验证码设置为2分钟失效 --- 主要用了jedis的 setex(key, seconds, value), get(key) 两个方法(对于jedis的操作用的是jfinal封装的Redis, RedisPlugin, Cache来处理的)
问题:
代码2直接用main方法执行,没有任务问题;但放在Controller对应的service层调用,每次都取不到值(刚设置好值立即调用get可以取到值,先调用方法写成功,再调用方法取就不能取到)
最后通过报错发现,是因为每次调用接口时,进入了一个自定义的拦截器(用于记录用户请求次数),会执行update语句,进而引发执行mybatis cache中clear()方法,此方法有两行代码 --- jedis.flushAll(); //删除所有dbIndex下key ,jedis.flushAll();//删除所有dbIndex下key;至此,问题找到是因为每次拦截器被触发,执行了jedis.flushAll();将所有已经写入redis中的key全部清除,导致代码2中读取对应的key为null,从redis的桌面工具可以看到确实,调用setex方法后,database 1中存在key,但取时key不见了!(哇哈哈,搞了1天半,终于在尝试了100次左右时,看到了一丁点报错,让我抓住了蛛丝马迹;开始一直没有报错提示,头大啊。)
总结:
当存在redis操作demo测试时不有问题,但换个项目执行出现问题,这时候一个要注意有没有报错信息,可以及时定位代码出错的地方,进行分析原因;另外一个要多思考一下,是不是哪里有代码对当前的代码执行造成了影响,像遇到的这种情况,通过redis图形界面工具是可以看key的生成与消失问题,那其实应该注意搜索一下是不是代码中有jedis.clear(), jedis.flushAll()等清除key相关的代码;当然最重要的是知道jedis中核心方法的作用,才能及时发现问题出现在哪里!