周末在家值班,解决几个月前遗忘的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(); 疯了已经…

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/68010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day3 STM32 GPIO口介绍

GPIO接口简介 通用输入输出接口GPIO是嵌入式系统、单片机开发过程最常用的接口&#xff0c;用户可以通过编程灵活的对接口进行控制&#xff0c;实现对电路板上LED、数码管、按键等常用设备控制驱动&#xff0c;也可以作为串口的数据收发管脚&#xff0c;或AD的接口等复用功能使…

家政服务平台|家政上门服务系统打开时代新渠道

在快节奏的现代社会&#xff0c;工作和家庭的双重压力常常使人们备受折磨。为了缓解这种压力&#xff0c;我们公司推出了一款创新的家政上门服务系统&#xff0c;旨在为您提供便捷、高效的生活服务。通过结合先进技术和人性化服务&#xff0c;我们致力于改善您的生活品质&#…

JPA实现存储实体类型信息

本文已收录于专栏 《Java》 目录 背景介绍概念说明DiscriminatorValue 注解&#xff1a;DiscriminatorColumn 注解&#xff1a;Inheritance(strategy InheritanceType.SINGLE_TABLE) 注解&#xff1a; 实现方式父类子类执行效果 总结提升 背景介绍 在我们项目开发的过程中经常…

CMake:检测python模块和包

CMake:检测python模块和包 导言项目结构CMakeLists.txt相关源码 导言 上一篇&#xff0c;我们基本了解了如何去检测python的解释器和python库。通常&#xff0c;代码是依赖于特定的python模块&#xff0c;无论是python工具、嵌入python的程序&#xff0c;还是扩展python的库。…

法律监督大数据平台有什么作用?

大数据赋能时代法律监督&#xff0c;构建法律行业领域大数据监督模型。法律监督大数据研判系统助力检察机关以社会公正为核心价值追求&#xff0c;对执法不严、司法不公“零容忍”&#xff0c;强化对诉讼活动的法律监督&#xff0c;坚决维护法律尊严&#xff0c;坚决捍卫公平正…

创建Springboot+vue3项目

项目概述创建springboot项目加入mybatis-plus支持1.加入依赖代码2.创建数据库实例3.yml文件的配置4.编写测试代码5.测试结果 创建vue项目报错错误一错误二错误三 项目概述 后端&#xff1a;Springboot、mybatis-plus、java 前端&#xff1a;nodejs、vue脚手架、element-ui 数据…

研发工程师玩转Kubernetes——PVC使用Label和storage选择PV

在《研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化》和《研发工程师玩转Kubernetes——使用local型PV在不同Pod上共享数据》中&#xff0c;我们介绍了指定VPC的spec.volumeName为PV名称来绑定它们的方法。本文将介绍PVC在创建时&#xff0c;系统自动选择绑定…

GEE学习04-

0 回顾 之前学习的内容可以概括为&#xff1a; conda activate gee cd /d e:/geelearn jupyter lab可以在prompt中chrlc停止当前打开的jupyter lab. import ee #ee.Authenticate() import geemap geemap.set_proxy(port 1080) map geemap.Map() map1、视频课学习 之后跟着…

SonarQube安装与Java、PHP代码质量分析扫描

文章目录 1、下载安装1.1、SonarQube下载1.2、SonarQube安装1.3、SonarQube中文汉化1.4、SonarScanner扫描器 2、扫描项目2.1、java代码扫描2.2、php代码扫描 1、下载安装 SonarQube负责存储代码数据、收集数据、分析代码和生成报告等。 1.1、SonarQube下载 下载地址&#x…

【TypeScript】类型断言-类型的声明和转换(五)

【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09; 【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09;一、简介二、断言形式2.1 尖括号语法2.2 as形式 三、断言类型3.1 非空断言3.2 肯定断言-肯定化保证赋值3.3 将任何类型断言为any3.4 调…

ngrok内网穿透可以实现资源共享吗?快解析更加简洁

随着互联网的高速发展&#xff0c;越来越多的人开始意识到内网穿透技术的重要性。在这一技术中&#xff0c;ngrok已经成为了一个备受关注的工具。然而&#xff0c;很多人对于ngrok是否可以进行资源共享存在疑问。本文将从新的角度出发&#xff0c;深入探讨这个问题。 了解什么…

要实现智能制造到底有多难?先看看这一步...

是新朋友吗&#xff1f;记得先点上方蓝字关注Ruff 智能制造、数字化转型&#xff0c;已成为当下制造业最炙手可热的话题&#xff0c;政府工作报告中已多次提到&#xff0c;为了促进数字经济发展&#xff0c;加强数字中国建设整体布局&#xff0c;打造智能工厂、智慧工厂。愿景是…

【Linux】-- 进程间通信

目录 一、进程间通信介绍 二、管道 1.什么是管道&#xff08;pipe&#xff09; 2.重定向和管道 &#xff08;1&#xff09;为什么要有管道的存在 &#xff08;2&#xff09;重定向和管道的区别 3.匿名管道 &#xff08;1&#xff09;匿名管道原理 &#xff08;2&…

mysql索引的数据结构(Innodb)

首选要注意,这里的数据结构是存储在硬盘上的数据结构,不是内存中的数据结构,要重点考虑io次数. 一.不适合的数据结构: 1.Hash:不适合进行范围查询和模糊匹配查询.(有些数据库索引会使用Hash,但是只能精准匹配) 2.红黑树:可以范围查询和模糊匹配,但是和硬盘io次数比较多. 二…

机器学习笔记 - 关于GPT-4的一些问题清单

一、简述 据报道,GPT-4 的系统由八个模型组成,每个模型都有 2200 亿个参数。GPT-4 的参数总数估计约为 1.76 万亿个。 近年来,得益于 GPT-4 等高级语言模型的发展,自然语言处理(NLP) 取得了长足的进步。凭借其前所未有的规模和能力,GPT-4为语言 AI​​设立了新标准,并为机…

vue-pc端实现按钮防抖处理-自定义指令

前言 我们经常在移动端会处理按钮和输入框的防抖和节流处理&#xff0c;在pc端很少进行这样的操作 但是在pc端也是可以进行按钮的防抖操作&#xff0c;这样也是比较合理&#xff0c;可以不用但不可以不会 我们只要配合vue项目自定义指令加上全局注册&#xff0c;就可以实现按…

Linux下安装VMware虚拟机

目录 1. 简介 2. 工具/原料 2.1. 下载VMware 2.2. 安装 1. 简介 ​ VMware Workstation&#xff08;中文名“威睿工作站”&#xff09;是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的操作系统&#xff0c;和进行开发、测试 …

同步代码块使用错误示范 | 用了synchronized还是出现“超取”问题

记录一下错误&#xff0c;吸取经验&#x1f914;&#x1f60b; 出问题的代码 public class Test {public static void main(String[] args) {new Thread(new Account()).start(); //&#xff01;&#xff01;new Thread(new Account()).start(); //&#xff01;&#xff01;}…

跨境电商线上店铺智能装修系统源码开发

搭建一个跨境电商线上店铺智能装修系统源码开发需要以下步骤&#xff1a; 1. 确定需求&#xff1a;首先&#xff0c;需要明确线上店铺智能装修系统的具体需求。 2. 选择开发语言和框架&#xff1a;根据需求&#xff0c;选择合适的开发语言和框架进行开发&#xff0c;可以提高…

docker容器监控:Cadvisor+InfluxDB+Grafana的安装部署

目录 CadvisorInfluxDBGrafan安装部署 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、查看Cadvisor 容器&#xff1a; &#xff08;1&#xff09;准备测试镜像 &#xff08;2&#xff09;通…