This website requires JavaScript.

redis缓存出现空值、key值出现空格的排查过程

分类:编程人生 发布于:2020-12-11 15:36:16 字数 1881 256次阅读 项目部署mysqlredisjava

1. 缓存存在两个相同的key,其中一个key是带空格开头的情况。

 1.  猜测可能是缓存出现了问题,清除缓存,重新运行本地程序加入缓存进行分析,出现问题的情况时有时无,导致无法做出准确的判断,到底是哪里出现了问题。大概率排序此因素造成的原因,转至其他方面进行排查。      

 2.  从数据库层面进行排查,是否是由于数据存储的时候论文主键存在带空格的情况,通过sql语句查询,发现其数据全部正常。排除此因素

 3.  猜测是否是由于前端参数造成,这里没有进行仔细的排查,在前端接口请求是通过trim方法去掉空格,然后清除缓存重新进行测试。
     加入去除空格之后问题没有再次出现,缓存也正常,这里已经确定是由于加入缓存时论文主键已经存在了带有空格情况。
image.png
 4.  继续进行问题查找,由于之前出现问题的时候的缓存存在双份数据,所有从列表查询开始入手,进行下一步调试,重新
     清除了页面缓存之后进行调试。调试结果首页查询出现带空格情况,原因如下
image.png
 加入缓存的时候由于执行了toString方法,而AbstractCollects接口的toString方法的实现组合元素就是加入了空格。  

2. 当从第三方api获取数据出现超时(timeout)的情况下,页面会出现空值现象。

  1.  这个问题是排查上个问题出现的新问题,当时我们认为这个就是查新第三方api的数据时候出现了超时的情况所导致的。

  2.  之后我们对此进行了一个处理,保证此方法结果要么返回null值,要么返回正确的结果对象,不会因为任何因素导致返回的数据为一个空的结果对象。
image.png

image.png
 3.   测试之后发现此问题还是存在,继续进行下一步排查,是否由于缓存不生效原因所导致,将null值也加入了缓存。以下的代码不缓存null的判断。
image.png
4.    继续进行调试,如果存在超时的情况这时候返回的null值会不会进入缓存,调试出现timeout情况,页面出现了null值情况,原因已确定是由于超时timeout所导致的。

5.    继续二次调试查找,当出现timeout的情况下,页面返回的数据增加了null值,具体看代码如下,null值也会被组装成结果集传入前端。
image.png

加入非空判断,问题解决。

总结:查找问题需要细心,不要放过任何一个细节,忽略的小地方可能就是问题出现的原因。