清远市seo广告优化,seo整站优化报价,开发一个网站系统报价,官网设计报价问题#xff1a; 周末被迫在家值班#xff0c;无聊之际打开尘封已久的Bug清单#xff0c;发现有Bug拖了几个月还没解决… 场景是这样子的#xff0c;有个功能是拿Redis缓存热点数据进行展示#xff0c;暂且称它为功能A#xff0c;有个另外的功能B#xff0c;它会去更新缓…问题 周末被迫在家值班无聊之际打开尘封已久的Bug清单发现有Bug拖了几个月还没解决… 场景是这样子的有个功能是拿Redis缓存热点数据进行展示暂且称它为功能A有个另外的功能B它会去更新缓存中这个热点数据另外有定时任务去执行缓存数据持久化 按理说这样子设计是没得问题的。不会出现数据一致性问题信誓旦旦 现象 可是问题就出在功能B更新缓存数据后功能A展示的还是旧数据且查看Redis缓存数据是已经更新了的 ! 那为啥功能A还能拿到旧的缓存数据呢而且还是有时会有时不会搁着给我卡bug是吧 当时硬是没排查出原因把问题定位在了网络请求不稳定上面因为控制台报了 Command timed out after 8 second(s) 这个问题有时候请求一直掉队 哎。后面就只是记录下来这个问题没再去探究过了直至今天有幸公司给了这个“值班”机会我才又重新去针对它 原因 我使用了Java的stream流式操作但是忘记加终止操作导致流式操作过程并没有执行所以我功能A从缓存拿数据就是不可能的 那为啥有时候有可以了呢 ?!? 嘚我还有个定时任务呢一分钟执行一次靠了当时没记起来这茬行马上给你这流式计算终止掉 可恶啊忘记去collect 终止操作来将stream映射的结果进行收集了小样拿捏你 stream在Java中是一种延迟计算的操作只有遇到终止操作才会触发中间操作 解决步骤 1、终止流式计算 2、排查新问题空指针 一、终止流式计算
在代码块后面加collect(Collectors.toList())收集结果即可 当我信誓旦旦去启动项目时访问报错空指针…
二、排查新问题
空指针还不好解决么小菜一碟
我有一个map键值对类型是MapString, Integer 在流式计算中我使用get(key)方式去拿map中的value 因为拿到的数据是个Integer我对象的属性是long类型所以我给他转了一下。这玩意你跟我说会失败开玩笑咯。 结果返回null…
难道真的是我map缓存中没有此值吗
我在方法执行开头 和 流式计算里面都打印map信息 Map.forEach((key,val) - log.info(Map{},key:key;val:val))
结果你猜怎么着数据一样我的天
奇了怪了咋地会发生这种逆天的事情呢
问了一下GPT他说这个现象很奇怪 后面还是死活找不到问题上了个厕所回来后发现我tm对象的id属性是long类型的我拿一个long类型的值去一个key是String类型的map去查查都出东西就有鬼咯肯定得先toString一下再去查啊
Map.get(obj.getId().toString()).longValue(); 这样子才是正确的啊 起初用的Map.get(obj.getId()).longValue(); 疯了已经…
这代码敲的属实太不严谨了那时候人都给看懵了还好问题终于解决