关于这周工作中遇到的关于缓存问题的记录

序:本周在工作中遇到了一些麻烦,解决过程比较曲折和辛苦,特此记录,留作经验供以后参考

发现问题:周一上班的时候,运营打电话来说,我们上个月做的一个活动感觉数据不对,商家过来投诉了。结果我数据库一查,数据还真有问题!这次的活动采用的是页面上使用缓存系统显示活动数值(总金额),同时在后台记录详细的每条活动数据的办法。每次用户发生业务行为的时候都会在后台的缓存的总金额上增加,同时记录这次行为发生的金额数。结果我周一把数据库的记录加一起来一算,发现和页面上缓存的总金额竟然差了将近一半!

解决的过程:

1.由于数据库记录了每次业务行为的具体数据,而且比缓存的总金额要多。我第一时间想到的就是缓存系统哪里出错了。于是我先去服务器上找日志,可惜的是活动时间过去太久,服务器上的日志已经没有当时的记录了(郁闷!)。于是我只能靠自己来找出当时的BUG了。

2.我想到在上线之前我已经在线下环境和预发环境做过测试,缓存的数据和数据库的数据是会保持一致的。难道是因为线上的环境有2台服务器,又或者是在高并发大数据的情况下,才会产生的错误,又或者是其中某一台服务器的缓存服务器发生故障了?(因为数值刚好差了近一半么,如果其中一台服务器的缓存出错了,数值就符合了)。于是我修改了代码,重现了当时的业务场景,结果发现在比较高的并发量的情况下,2台服务器均未出现缓存服务故障和数据库不一致的现象。之后我又询问了其它开发和缓存部门的人,确定了在当时的访问量下,缓存和服务器应该不会出现瓶颈。于是乎,我的假设失败了,BUG还是没找到。

3.在接下来的一天里,我详细检查了各个地方,进行了各种假设,均为能测出这个数据不一致的BUG。而且要命的是,我在服务器上模拟当时的场景也没有出现这个BUG。于是我想到,这个BUG可能是那种只有在特定时间或着条件下才会出现的状况。一般像这种情况的问题最难处置了,因为可能出问题的地方可能已经消失了,不知道什么时候又会出现。第二天,我正向运营主管反应这个情况打算放弃的时候,他告诉了我一个重要的线索!他说在活动结束前的时候,他发现活动的总金额有过突然减少的情况,这个情况是出乎我意料的。因为之前的一直以为是缓存系统哪里出问题,导致增加的计数器没起效果。但是他说总金额有突然变少过,我写的业务代码中根本没有减少金额的逻辑,也就不可能存在金额减少的情况。于是乎,我把侦查重点又转移到了缓存系统本身上去。因为既然我写的代码根本不可能导致总金额的减少,那就一定是缓存系统本身出了什么问题,才会出现这种金额减少的状况。

4.接来下,我与缓存系统的技术支持电话里确认。询问了到底什么情况下,缓存系统会有金额减少的状况发生。在给他展示了我的关键性代码之后,他告诉我,如果我存在缓存里的数值“丢失”的话,因为我在代码里没有做“防灾”处理,数值可能是会重新归零的。缓存数值的“丢失”!这是我在之前没有考虑过的情况,因为我之前询问过开发的前辈,他们说这套缓存系统十分的稳定,因此我就大胆的直接使用它进行了业务数值的展现。而且从缓存系统的监控里,我也找不到类似于缓存溢出的情况。后来这个缓存部门的技术支持告诉我,由于我使用的是一块公用的缓存服务器,即使我本身分配的缓存空间还很多,但是如果其它用户此时有很大的缓存进来的话,是有可能把我驻留在内存里的数值给“丢失”的。

5.到这里,我基本上就想通了。在我上个月活动的那几天里,由于缓存系统其它用户出现的某些大负载量的状况,把我保留在缓存系统里的业务数据(总金额)给弄“丢失”了。而我由于天真和大意,没有考虑到缓存系统数值丢失的状况,只是一味的往上加一,即使在缓存系统里的数值“丢失”归零之后。于是就出现了数值突然下降,最终和实际数值不一致的情况。找到了问题的原因,解决办法也很容易想到。就是在这个业务场景下,考虑到缓存可能“丢失”的情况,在每次给缓存加一的时候,先判断下缓存是否存在,如果不存在就去数据库里取当前记录的总值。

经验总结:

  找BUG往往是程序员最痛苦的事情之一,而像我这次碰到的这种在某些情况下才会发生的BUG,就更是难以被发现和处理。这时往往就得像侦探办案似的,收集各种线索,进行各种假设。模拟业务场景,往往是程序员找出BUG,最常使用的手段,但当这次这种无法重现的场景出现的时候,就只能靠“线索”了。“线索”是指那些有用的信息,比如运营人员反映的数值突然下降过的事,比如日志和数据记录。这些平时看起来不重要的事物,在这时都有可能会变成有用的“线索”。所以平时保存日志和备份数据,还有监控记录,这些东西在分布式,大数据的系统下就变得很重要了。

  另外,还有最重要的一点,就是对找“BUG‘这件事本身的毅力也很重要,因为在找”BUG‘的过程中,可能会四处碰壁,这时如果放弃了,那这个BUG就永远淹没成为过去了。但是如果你坚持下去,把他找出来,那你就能优化自己的代码和系统,对于自身也是技术的增长和经验的积累。

关于这周工作中遇到的关于缓存问题的记录,布布扣,bubuko.com

时间: 2024-10-13 20:15:14

关于这周工作中遇到的关于缓存问题的记录的相关文章

工作中遇到的问题--缓存配置(使用@Configuration装配 @Bean的方式注入)

@EnableCaching@Configurationpublic class MFGCachingConfiguration { @Autowired private MFGSettings mfgSettings; @Bean(name="MFGKeyGenerator") public KeyGenerator MFGKeyGenerator(){ SimpleKeyGenerator defaultKeyGen = new SimpleKeyGenerator(); KeyG

2016-7第一周工作总结

姓名 王奈 时间 第一周工作总结 学习内容 经过了一周的开发与改进,我们的easy工大已经初见成果.这一周,我们完成了:界面的重新设计,数据获取正确性修改,以及吐槽墙功能的实现等等.我的工作就是文档记录,在这过程中,我能够记录我们项目进步的点点滴滴,记录它是如何一步一步走到现在的样子,就像看到了软件的成长过程一样. 除此之外,我还完成了一个嵌入式开发项目的初步实现,学习了嵌入式编程的原则以及优化方法.如同软工所要求的一样,我在嵌入式开发的过程中也使用了文档记录的方法来管理我们的项目进度,这样一来

工作中请注意的十点

第一:不要认为停留在心灵的舒适区域内是可以原谅的. 每 个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照规定的时限做事, 不愿意主动的去关心别人,不愿意去思考别人还有什么没有想到.这在学生时代是很容易被理解的,有时候这样的同学还跟“冷酷”“个性”这些字眼沾边,算作是褒义.然而相反,在工作之后,你要极力改变这一现状.否则,你会很快变成鸡尾酒会上唯一没有人理睬的对象,或是很快因为压力而内分泌失调.但是,如果你能 很快打破

程序员工作中会遭遇的天花板 工作中不由你控制的一些地方(转)

在我看来,程序员做的是开创性的工作.互联网的发展不但推动了技术的发展,而且带来了技术的普及.因此程序员不比以前,现在要找某方面的资料是很easy的事情了.看过大量的资料,各种新颖的技术方案和解决思路,不心动那是不可能的.OK,想用某某某框架,想用某某某技术,但是,因为各种原因,没办法应用到自己开发的项目中.这就是一个天花板. 在工作中往往有各种各样的天花板,比如绩效考核,项目进度,被打断的思路,技术架构.因为你不是做决定的那个人,所以你就有天花板. 绩效考核 很多公司都有绩效考核,在我看来绩效考

在工作中如何做到优秀,在工作之外如何做到自己(一)

首先,既然想讨论这个问题,肯定是自己没做到. 罗老师,您能让我把话说完吗?(sorry,刚才老罗乱入) Part 1,在工作中如何做到优秀 积极.认真的态度,这个最重要. 要有心把手中的工作做到最好,才有可能做到,否则以一种随便的态度对待,事情的完成度可想而知.在一些小的事情上,也要认真.举两个一直记到现在的例子吧,一是高中毕业时,学生要写一些教学反馈和意见,我这个懒人就随便写了点,但是前座团支书写的让我吃了一惊,文书工整.条理清晰.写的满满当当的.这是一种习惯,也是学生对学校应有的责任.另一个

你在工作中无意间会犯的四个错误

4 Work Mistakes You Don't Realize You're Making你在工作中无意间会犯的四个错误When you’re the new girl at work, you do everything in your power to stay on your best behavior. You show up to the office early, leave late, dress conservatively, and absolutely never, ev

新手产品经理工作中常遇到的25个困惑问题

本文和大家分享的主要是新手产品经理工作中常见的一些问题,一起来看看吧,希望对大家有所帮助. 1.竞品分析的目的有哪些? 论证自己的判断是对的,补充自己的欠缺,知道不知道的. 2.在进行从0-1产品规划的时候和进行产品迭代的时候竞品分析的目的有何不同? 0-1的时候主要是看战略,来论证自己做的这个东西是有市场价值.有用户价值的. 迭代时候竞品分析主要是看体验和功能,或者称之为具体的好与坏.对与错. 3.竞品分析是如何验证假设的? 说下的理解哦,首先假设的东东是要量化出来的,数量上的具体和每一个的数

工作中遇到的几句话

实施人员: 话不要说的太大,想想好再说(书**) 熟悉具体的业务,必须熟记,甚至背下来,自己首先处理,除非处理不了,否则不要轻易问,问要有想法(管**) 同事: 属性业务流程,走通流程,挂接具体的业务操作(周**) 看待问题的角度是什么(李**) 经理: 知识面要广,之后找一个点深入研究,通过广的面支撑这个点(张**) 以上是个人工作期间,别人对自己的一些建议 工作中遇到的几句话

工程师如何在工作中提升自己?(公众号)

工程师如何在工作中提升自己? 2018-04-21 刘丁 程序人生 点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 引言 古人云:“活到老,学到老.”互联网算是最辛苦的行业之一,“加班”对工程师来说已是“家常便饭”,同时互联网技术又日新月异,很多工程师都疲于应付,叫苦不堪.以至于长期以来流传一个很广的误解:35岁是程序员工作的终点. 如何在繁忙的工作中做好技术积累,构建个人核心竞争力,相信是很多工程师同行都在思考的问题.本文是我自己的一些总结,试图从三个方面来解答: