善于总结,才能更快进步

通常,我们队高并发的数据都会进行缓存,而且为了防止缓存过大,通常我们都会把缓存设置一个超时时间,并且会有cache miss机制。本文,我记录一下错误的缓存机制引起的BUG。

起因

好好的一个国庆,自己完全没歇停,让我给毁了。线上一次cache miss导致缓存数据错误,便一直在查因。然后重写代码、测试、上线。emmm......

直接看代码

当然是伪代码了

cache = new cache();

data = cache.getData();

if(isempty(data)) {

data = getDataFromResource()

if(!isempty(data)) {

cache.setData(data)

}

}

看上去没错哈,一般我们处理缓存的确是用这个步骤:

读取缓存

若cache miss(超时、网络原因),从数据源读取缓存

重新设置缓存

正常来说,这样的确是没问题的。

但是,请接着往下看。

资源类大致是这样的

//上文getDataFromResource() 就是本类中读取数据

class resource{

private static connection = new Connection();

public static getConnection() {

return connection;

}

public getData() {

try{

//todo:do anythings

data = connection.get();

return data;

}catch(e){

return null;

}

}

}

而我的缓存类是基于资源类的

class cache extends resource {

}

就是说,我缓存类依赖的连接资源,也是我原始资源的来源。

事故原因

当其中某次请求发生错误的时候(比如连接不可用,网络卡顿丢包等等),资源类中的基类方法请求失败,因此返回了NULL。 可能会感觉很奇怪啊,明明我有空校验。但是,业务是复杂的,缓存的数据是从多方资源获取而来,因此,上文getDataFromResource()方法并不为空,而是有部分数据存在。

因此导致了缓存只将部分数据写入失败!!!!!!

解决方式

不要信任数据源一定是正确的,要考虑数据源可能存在不正确的方式(目前处理方式)

if(isempty(data)) {

data = getDataFromResource()

if(!isempty(data)) {

//todo:增加数据校验

if(isValid(data)) {

cache.setData(data)

}else{

//todo:发送邮件通知,告诉开发数据可能不稳定

mail.send();

//todo:抛出异常,控制器处理,本次请求失败

throw Exception();

}

}

}

或者提前计算好缓存,本次cache miss直接抛出异常,不需要计算考虑复杂的逻辑

java开发事故如何处理_记一次缓存事故相关推荐

  1. 初级java开发学习路线_成为初级全栈Web开发人员的10分钟路线图

    初级java开发学习路线 So you have started your journey into the world of web development. But what do you lea ...

  2. java开发cs项目_本硕机械转行cs(java后端开发)上岸之路

    秋招转眼就结束了,将近一年的努力,总算给了自己一个比较满意的结果.写下这篇贴子记录自己的转行以及秋招经历. 其实在转行初期,就无数次幻想着秋招结束,然后写一篇长长的经验贴的那种满足感.下面我尽量把我知 ...

  3. 学java 开发会掉头_作为一个全新的开发人员,我会学到什么

    学java 开发会掉头 重点 (Top highlight) It's been five years since I learned to code and changed careers. 自从我 ...

  4. java开发面试复试_面试java开发,面试官会问哪些问题?

    作为一个当初从学校刚毕业找工作而被面试饱经摧残的小白,到现在的java开发从业人员,中间不可谓之不艰辛,当初的屡屡碰壁,工作受挫,一直到现在我仍然认为那是我人生中不可或缺的一段经历. 关于面试的艰辛这 ...

  5. java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

    java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...

  6. java开发常见异常_最常见的Java异常及其对Java开发人员的评价

    java开发常见异常 我知道我说过在完成视频之前我不会发帖,但这一直困扰着我. 至于视频的更新,我有些懒散,有些忙碌,但是我已经准备好记录第一集,这是我第一次有机会,而且我不需要太多的编辑. 无论如何 ...

  7. java开发简历编写_如何通过几个简单的步骤编写出色的初级开发人员简历

    java开发简历编写 So you've seen your dream junior developer role advertised, and are thinking about applyi ...

  8. 海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...

    在找工作之前,大家都要做一些准备工作,java开发也是如此 掌握核心JavaSE 首先,从核心Java(JavaSE)开始学习,尽可能地掌握它.你应该了解和掌握一些基本概念,如循环,数组,运算符等等. ...

  9. java 开发书籍 目录_《零基础 Java 开发 》全书目录

    第1部分 Java开发基础 第一章 搭建Java开发环境 1.1 Java简介 1.2 Java开发环境搭建 1.3 Java语⾔的功能 1.4 使用Eclipse开发Java程序 1.5 使用IDE ...

最新文章

  1. 2007过年休息的日子
  2. 脚本路径问题_dirname
  3. 大话App测试2.0笔记2
  4. 一个使用 asyncio 协程的网络爬虫(一)
  5. python脚本画pie饼图_python 使用matplotlib.pyplot.pie绘制饼图
  6. (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
  7. C#调用百度地图API入门解决BMap未定义问题
  8. 【数据结构】C++单链表实现多项式加法(直接输入多项式)
  9. P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】
  10. MIP 移动网页加速器视频教程全新发布
  11. 3_数据分析—数据清洗及特征处理
  12. oracle mysql 数据类型对比_Oracle、SQL Server、MySQL数据类型对比
  13. pytorch 实现RBF网络
  14. 拓端tecdat|使用R语言进行机制检测的隐马尔可夫模型HMM
  15. LitePal的简单使用
  16. syslinux和grub引导linux,在Arch上使用Syslinux替代GRUB
  17. Tensorflow基础语法以及网络搭建
  18. 菜鸟在学编程__LSJ
  19. 使用多个磁盘分区创建逻辑卷
  20. JAVA 安全-JWT 安全及预编译 CASE 注入等

热门文章

  1. Java代码风格:最终决定
  2. 使用Java WebSockets,JSR 356和JSON映射到POJO的
  3. Java – JDK 8的远景
  4. PIT和TestNG突变测试简介
  5. win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...
  6. oracle10g-创建表空间 用户
  7. oracle导数的数据乱码,Oracle10g导数据时中文乱码相关处理
  8. 怎么把word里面虚线变成实线_弱电不会制作cad图,花3分钟看完,只要会用WORD保证你能画出来...
  9. linux 丢包多少正常_Linux 问题故障定位,看看这篇
  10. oracle utl inaddr,oracle11g之ACL拙见