清缓存的姿势不对,真的会出生产bug哦

最近解决了一个生产bug,bug的原因很简单,就是清理缓存的方式不对。本来没啥好说的,但是考虑到我们有时候确实会在一些小问题上栽跟头,最终决定把这个小故事拿出来跟大家分享下。风起有一天在撸代码,突然

大家好,又见面了,我是全栈君。

清缓存的姿势不对,真的会出生产bug哦

 

最近解决了一个生产bug,bug的原因很简单,就是清理缓存的方式不对。本来没啥好说的,但是考虑到我们有时候确实会在一些小问题上栽跟头,最终决定把这个小故事拿出来跟大家分享下。

 

风起
有一天在撸代码,突然有个人加我微信,看头像是个妹子。我第一反应:对方是微商或者卖茶叶的(忍住,别笑)。因为已经有很多次这种加我好友的情况了,问对方是谁就从来没有下文。所以这次我也没有通过,而是像以前一样追问了一句“我们认识吗”,就没再管它,心想对方肯定不回的。然后继续然后继续撸串,哦不,是撸代码。
还没1分钟,对方竟然回复了,大意是“我是xxx公司的某某某,有个问题想咨询下”,哇哦,原来是客户。。。赶紧通过验证并问具体啥问题。原来是对方在点某个页面按钮的时候一直提示错误,不能正常进行业务了。

 

常规操作
和以往一样,我查起了生产log,发现是数据库锁表了。客户是业务型公司,一般不会出现多人同时操作的情况,数据量也不大,生产上从来没有出现过,倒是我本地调试的时候经常因为性子急多点几次导致锁表,因此感觉这个问题很好解决,让管理员把锁解了就行了。

 

云涌
没有锁了,让客户再试下,客户的反馈“还是报错”,没道理啊。再查日志,发现已经没有了堆栈信息,为啥还不行呢。
没办法只能看那个时间段所有的log,发现有一行“map缓存中有数据,可能多人同时操作”。
查下代码,发现代码中为了防止同一条数据多人同时操作,加了map作为缓存,数据记录的PK作为key和value。
清缓存的姿势不对,真的会出生产bug哦

(记住这个图,后面会考)
每次操作的时候将数据put进map,处理完后remove掉。如果map中有相关KV就表示这条记录有人正在操作,则其他人不能操作,抛提示信息。
于是乎问客户“多人同操乎?”,得到的答复是“否”,纳尼?怎可能。日志是不会骗人的啊

 

再查代码
针对map再把代码看一遍,看它put和remove的地方,还有日志打印的地方。终于发现一个问题,
map的清理动作是在try里面正常处理后做的,如果出现异常就不能正常清理了,而map定义的时候为了对象间共享定义成了静态成员变量,
刚才的锁表抛了异常,当时已经put进入到map里面的KV就一直没有机会清掉了,也就是说只要服务不重启,问题会一直坚定的陪着你。
清缓存的姿势不对,真的会出生产bug哦

 

对症下药
1.跟领导申请紧急重启服务,保证业务正常进行。
2.修改问题代码,将报错放到finally块。
3.横展开调查其他类似代码是不是也存在这个问题,一并修改。

 

风平浪静
问题解决,对方表示感谢,我也回复不客气,一切回归平静。

 

总结
其实这个缓存清理的问题本身很简单,大家都懂,就和释放数据库连接等情况一样,需要放到finally块里面,
这个即使代码抛异常了也能正常释放或清理。但是就是撸这段代码的时候,因为这样那样的原因一时没有想到。
如果公司有代码review的环节的话会好很多,如果没有review,那么在写完代码后最好自己review一遍。
否则,万一出现类似的问题真的有点尴尬,正如题目所说“清缓存的姿势不对,真的会出生产bug哦”。
希望你我今后都能避免这种情况的发生。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120882.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • (c,c++,java)爱心代码(狗粮)

    (c,c++,java)爱心代码(狗粮)今天(2019/8/7)是七夕,撒一波狗粮!有些人对计算机类的学生和程序员们有一点的误解,这是不对的。其实当他们浪漫起来的时候就没有其他人什么事了哈哈c款狗粮:#include<stdio.h>#include<math.h>intmain(){ printf(“\n”); printf(“\n”); printf(“\n”); printf(“…

    2022年10月13日
  • ods数据库是什么意思_数据仓库ods层和dw层的区别

    ods数据库是什么意思_数据仓库ods层和dw层的区别这两天看书,发现了和数据仓库相关的还有一个叫ODS的概念,它是企业级的全局数据库,用于提供集成的,企业级一致的数据,包含如何从各个子系统中向ODS抽取数据以及面向主题的角度存储数据。它和数据仓库的主要区别:数据仓库是面向主题的、集成的、随时间变化的、非易失的、用于进行战略型决策的数据集合。ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息…

    2022年9月26日
  • kali linux破解wifi密码-超详细过程

    前期准备VMwareWorkstation虚拟机在虚拟机安装好kaillinunx系统无线网卡(芯片为3070或者1887L都支持Linux)一.打开终端,用airmon-ng命令查看如果出现无法访问…没有那个文件或目录解决办法:先在window主机上按win+r键然后输入services.msc回车找到VMwareUSBArbitrationService,双击…

    2022年4月8日
  • 小技巧 – Chrome 浏览器绕过“请在微信客户端打开链接”

    小技巧 – Chrome 浏览器绕过“请在微信客户端打开链接”微信和QQ内置浏览器UA~安卓QQ内置浏览器UAMozilla/5.0(Linux;Android5.0;SM-N9100Build/LRX21V)>AppleWebKit/537.36(KHTML,likeGecko)Version/4.0>Chrome/37.0.0.0MobileSafari/537.36V1_AND_SQ_5.3.1_196_YYB_D>QQ/5.3.1.2335NetType/WIFI安卓…

    2022年6月7日
  • java中main方法是怎么运行的?

    java中main方法是怎么运行的?学过java的都知道main方法是学习java的开始,也是程序的入口,不过你有多少个类或程序,线程,他们的入口方法都是main()main方法是一个静态的方法,所以这个方法是属于类的,而不是对象的;在main()方法中,参数类型是“String[]args”,意味着在启动Java应用的同时,传递一个String类型的数组来定制化应用的初始化属性。执行过程:现在

    2022年5月31日
  • java常量有哪些_Java中的常量有哪些?

    java常量有哪些_Java中的常量有哪些?JAVA常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。那么java的常量有哪些呢?在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。下面我们就一起来看看java中的这些常量。1.整型常量整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式具体表示形式如下。二进制:由数字0和1组成的数字序列。在JDK7.0中允许使用字面值…

    2022年7月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号