redis在main方法中成功操作,在web项目、Controller接口请求失败

2 篇文章 0 订阅
1 篇文章 0 订阅

定位原因:

        代码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中核心方法的作用,才能及时发现问题出现在哪里!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星梦天河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值