当前位置: 首页 > news >正文

周末在家值班,解决几个月前遗忘的Bug

问题:

周末被迫在家值班,无聊之际打开尘封已久的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,键值对类型是Map<String, 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(); 疯了已经…

这代码敲的属实太不严谨了那时候,人都给看懵了,还好,问题终于解决!

http://www.lryc.cn/news/115281.html

相关文章:

  • Shell编程基础(十五)文本三剑客(sed)
  • 5,二叉树【p6-p7】
  • 【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry
  • pagehelper 优化自定义分页和排序位置
  • Linux下查询文件夹中文件数量的方法
  • PS透明屏,在科技展示中,有哪些优点展示?
  • Hbase-面试题
  • 图的宽度优先深度优先遍历
  • redis Set类型命令
  • Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发
  • TCP的四次挥手与TCP状态转换
  • 【网络编程】实现一个简单多线程版本TCP服务器(附源码)
  • centos离线部署docker
  • ffmpeg使用滤镜对视频进行处理播放
  • Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件
  • threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率
  • RocketMQ 主备自动切换模式部署
  • 【MySQL】select相关
  • 在Python中应用RSA算法实现图像加密:基于Jupyter环境的详细步骤和示例代码
  • Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息
  • 数据结构之时间复杂度-空间复杂度
  • 新一代构建工具 maven-mvnd
  • 构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)
  • Leetcode.995 K 连续位的最小翻转次数
  • PHP8的跳转语句-PHP8知识详解
  • Idea中maven无法下载源码
  • 【linux-keepalive】keepalive避免单点故障,高可用配置
  • 测试网络模型的FLOPs和params
  • 《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机
  • 基于短信宝API零代码实现短信自动化业务