最近使用springBoot+redis项目访问是不是弹500和error,而且是无规律弹框,上一秒出问题的接口下一秒却又可以了???后面经过排查发现是reids的问题,报error是拦截器里从redis get登录存入的token时返回nul让项目认为是过期缓存返回401导致的,500错误经过检查是获取 get登录存入的用户对象信息时返回null导致的空指针异常,问题很明显就是存入的值没获取到,本来以为是序列化的问题,但转念一想我这是不定期报错又不是都报错,如果是序列化问题不应该接口都不行吗,折腾了两天都没找到原因,人都麻了,只到有一天我突然发现在拦截器里这几行代码:

 		//更新缓存时间
 		String key = LOGIN + loginName;
        redisService.getAndUpdateTime(key);
        redisService.getAndUpdateTime(TOKEN + loginName);

点进方法一看:

/**
     * 获得 key 对应的键值,并更新缓存时间,时间长度为默认值
     *
     * @param key
     * @return
     */
    public T getAndUpdateTime(String key) {
        T result = get(key);
        if (result != null) {
            set(key, result);
        }
        return result;
    }

意思是每次调接口都会重新set token和对象已延长登录时间,拿会不会是在覆盖值时取值导致的,然后我发现这个
在这里插入图片描述
注释掉更新缓存的代码后,果然问题解决
古古怪怪的问题,人麻了。。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐