开始表演

“表哥,我被虐了。” 表弟哭丧着脸对我说道。

“怎么滴,连跪?哥带你飞。”

“不是LOL,我这不秋招嘛,那个面试官逮着我问,把我都问蒙了。” 表弟一脸懵逼,怀疑人生。

“问啥了啊,我平时教你的唱跳 rap 都没用上?” 我幸灾乐祸的说道,这小子平时就跟我吹,什么天天考第一,进大厂跟玩儿一样,这不傻了吧。

“一来就问我一堆缓存的问题,什么是缓存啊,什么读写策略,如何保证缓存高可用啊,缓存穿透怎么处理啊,巴拉巴拉一堆,我记不得了都,整得我脑瓜子疼,你说我一个还没毕业的憨憨,至于嘛?” 表弟闷闷不乐,继续说道:“哥,要不教教我?”

“现在知道自己是憨憨了?我都说了叫你改下简历,你丫的一堆精通我看着都懵逼,梁静茹给你的勇气?”

“对对对我是憨憨,憨中之憨。哥教教我吧。” 表弟一脸舔狗样地看着我。

“哎,想喝奶茶了。这脑子啊突然就一片混沌,你刚说啥来着?”

表弟反应也是很快:“我现在就叫外卖,不,我直接骑我的小电驴去买,哥您稍等片刻,我去去就来。”

这小子转身就要出门,我在背后喊住了他。

“老弟啊,别买奈雪的茶里面的芝芝芒芒啊,那太贵了,我怕我喝不惯。”

表弟的嘴角动了动,最后勉强挤出一个笑容说道:“多喝喝就习惯了,我这就去买。”


什么是缓存

“回来了啊,来来来坐坐坐,哥先来给你讲讲什么是缓存。” 拿着芝芝芒芒深吸了一口,真香啊!

首先这个缓存主要是为了协调访问之间的速度差异而存在的一种东西,可以是一个硬件,也可以是一个数据结构。比如我们的内存就是因为磁盘访问太慢了,用内存存储一些磁盘上的数据,便于CPU的读取。

当然再深入还有L1、L2等缓存,也是因为嫌内存慢而产生的。

这种呢是因为纯粹的访问速度慢,还有一种慢,表明看起来是访问慢,实际上的访问的成本高。

什么意思呢?例如一个复杂的计算,如果每次都去算一遍拿结果,就慢了,于是就用缓存把结果存起来,下次就直接拿结果不用重新算了。这就叫空间换时间。

在我们实际工程应用上缓存可以分为三大类:静态缓存、分布式缓存、本地缓存

静态缓存常指的是前端静态页面,html 啊,js等等,常放在静态服务器上,还能通过 CDN 来缩减响应的时间,提高用户访问速度。

分布式缓存常指的是利用 Redis 、Memcached 等分布式缓存中间件来存放一些较为常用的数据,多个应用共享缓存,不仅可以提高访问速率,也算上在高并发下起到保护脆弱的数据库作用,算是高并发利器了!

本地缓存常指的是应用在同一个进程中的缓存组件,交互之间不会有网络开销,当你的项目还用不上分布式缓存,就存一些简单的变量时候可以用本地缓存来解决。最简单的 HashMap 就能作为本地缓存,或者Ehcache、Guava Cache等。

“老弟???你口水怎么都留下来了??”

“啊?没没没,只是我也想喝啊,这奶茶太贵了,我都没舍得给我自己搞一杯”,表弟目不转睛的盯着我手里的奶茶说道。

“做梦,赶紧的还问啥来着?” 我又深吸了一大口奶茶,真香!

“还有那啥缓存读写策略,我都不明白啥策略,不就去读缓存,没数据就去数据库读,读完了写到缓存中呗,有缓存直接返回就好了,更新数据就先更新数据库,再更新缓存上的数据不就得了,这么简单还跟我整啥策略,他咋不整个孙子兵法呢?” 表弟一脸不忿道。

“我给你整个爱情三十六计不?小年轻,没经历过社会的毒打,今儿我就带你看看没你想的那么简单!” 撩了撩我所剩无几的 “秀发”,戳了下我那厚重的眼镜。我清了清嗓子:“听好了!”


缓存读写策略

缓存读写策略其实是应对不同场景的。读的策略你说的没错,基本上都是这么个套路,但是写呢就比较讲究了。主要是就有因为分布式缓存数据是共享的,并且缓存和数据库属于两个独立的组件,这么一来数据就容易出问题。

比如你说的先更新数据库,再更新缓存,假如你现在账上有 100 块钱,你妈给你打了 100 块,数据库把你账上的钱变成了 200,然后呢你爸这时候刚好也给你打了 100 块,数据库账上此时变成了 300,你爸的那个请求把缓存更新成了 300,然后你妈的那个请求把缓存更新成了200,然后你账上就变成了200了。

就是因为并发更新,写入顺序不一样导致的

直接更新缓存还有个问题,例如A请求准备取缓存中的值,此时的值是1,然后+1,此时B请求也打算这样做,拿到的值也是1,这样更新到缓存里面的值就变成2而不是3。

因此还是得靠咱们得到数据库老大哥,它可以保证数据的正确。数据以它为准。这种策略叫cache aside 旁路缓存策略,也是最常见的策略。

读策略:从缓存中读数据。命中,则直接返回数据。不命中,则从数据库中查,查到数据后,将数据写入到缓存中,并且返回给用户。

写策略:先更新数据库,然后删除缓存(让数据库来保证数据正确,缓存就不更新,咱就做个搬运工,岂不美滋滋)。

“不对不对,先更新数据库,再删除缓存。假如有个A先读缓存,但是此时缓存是没数据,于是去数据库读数据,读到了数据,然后此时有B来更新数据库,然后删除了缓存。此时A再把缓存写回,这不就出问题了吗?表哥,你行不行啊?奶茶退我!” 表弟不乐意了。

“表弟,有点东西啊!你说的没错。其实不论是先删除再更新,还是先更新再删除,只是后删除出错的概率比较低!因为你说的情况需要一个请求先读缓存,然后需要等待另一个请求更新完数据库再删除缓存之后,再写入缓存,这个读缓存要早于数据库写并晚于数据库更新完毕且删除缓存几率很低。”

“并且一般为了解决最终一致性问题都会设置过期时间,避免脏数据一直存在。所以这种很小很小概率的事件,加上一些补偿措施还是可以容忍的。”

“行吧行吧,好像还挺有道理的,还有啥策略?”

“还有write through / read through,简单的说就是应用只和缓存打交道,由缓存自身来和数据库打交道。也就是说啥并发更新的咱不用管,write through就是写数据的时候如果缓存有数据则直接写缓存由缓存组件来同步数据到数据库,如果缓存中没数据可以选择和有数据一样的操作,或者直接写数据库。”

read through 就是从缓存中读,缓存中没数据由缓存组件自己去数据库加载。不过遗憾的是咱们常用分布式缓存都不支持这种,不过本地缓存例如  Guava cache 的 loading Cache 有点 read through 那味儿。”

“最后一个就是 Write back,这个策略的核心在于写缓存的时候会把缓存标记为脏,然后当缓存需要再次被使用的时候才会刷到后端存储中。当读缓存如果命中直接返回,如果没得话找干净的地儿(数据块)读取数据写入缓存,假设没有干净的地儿,就把脏的缓存块刷到后端存储,然后再写入数据,标记不为脏。”

“发现没 PageCache 就是这么个读写策略,也就是因为刷盘慢呀,所以脏缓存先存着。怎么样老弟,学会了没?”  我又深吸了一口奶茶,发出了丝丝的声音,满足。

“学会了学会了,哥真棒!那还有缓存高可用呢?怎么说?”

“高啥高,今天就到这,这几个策略你先回去好好学,这奶茶都没了,口干了说不了不了,下次一定下次一定。”

“别啊表哥,这奶茶32一杯呢,这才哪到哪啊?”

“赶紧滴,今天已经说了很多干货了,快一遍消化去”,我不耐烦地说道。

“就这?就这?真是有够好笑呢?我要找姨去!” 表弟要是能打得过我,感觉他应该要冲上来了。

“行行行,改天一定和你说........唉唉唉,把拖鞋放下!快放下!反了你!!!”

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶相关推荐

  1. Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口

    Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓 ...

  2. 教你前端面试技巧,教你如何涨薪!

    一位前端开发人员,需要了解一些技术更新.尽管很多人觉得没有必要学习所有的新技术,但始终保持"了解"和"理解"是必要的.今天就为大家介绍一下前端面试题. 教你前端 ...

  3. 程序员面试金典——17.1无缓存交换

    程序员面试金典--17.1无缓存交换 主要是利用异或性质~ 程序员面试金典--17.1无缓存交换 class Exchange { public:vector<int> exchangeA ...

  4. 字节跳动测试开发工程师-产品研发和工程架构部职位面试被虐

    字节跳动测试开发工程师-产品研发和工程架构部职位面试被虐 面向对象语言的封装.继承和多态 浅拷贝和深拷贝 类和对象 OSI七层模型.作用和每一层对应的协议 当python读入文件的时候发生了什么? 手 ...

  5. 大厂面试官手把手教你:三步写出好简历

    本文由作者 海贝学姐 发布于社区 最近一个月行业巨变,可能不少同学会有找工作的需求.学姐作为曾经的大厂面试官,经常看到一些不太合格的简历,不少还是工作三五年以上的,很多人是"做得多.写不好& ...

  6. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...

    面试官:虫虫你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 虫虫:我只知道这是用来缓存sql查询的数据 面试官:没了? 虫虫:没了 面试官:公司门知道在哪里吧 自己走还是我 ...

  7. 前端对所有文件请求添加header_【前端面试必问】浏览器缓存原理?送你满分答案...

    (本文适合所1-3年的前端阅读) 原文链接: http://blog.poetries.top/2019/01/02/browser-cache/ 一.浏览器缓存基本认识 分为强缓存和协商缓存 浏览器 ...

  8. 面试问题_教资面试,结构化面试问题分享

    教资面试,关于结构化面试的问题,有需要的自己提取. 链接: https://pan.baidu.com/s/1aSMvCjgWjRPKUjTrosv6EA 提取码: pdkd

  9. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

    对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣 ​ ​ redis缓存穿透 ​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据 ...

最新文章

  1. CCAI2018演讲实录 | 蒲慕明:脑科学与类脑机器学习
  2. 用Lucene建立搜索索引
  3. Maven学习(五)————依赖的特性辨析
  4. 深入浅出VC++串口编程--第三方类
  5. JDBC实现学生信息管理系统(仅增删改查)
  6. Ubuntu下 5步安装nginx记录
  7. java.lang.Class.isPrimitive()用法解析
  8. 经纬度两点距离计算器_基于位置的服务之Redis Geo地理空间距离计算
  9. [转]简单批处理内部命令简介
  10. ISO14443 PICC 与 PCD 调制解调方式
  11. 中心滤波与均值滤波MATLAB
  12. 医疗数据之医院管理型数据仓库解决方案
  13. 5.flask与数据库
  14. 论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
  15. 聚类算法及其模型评估指标【Tsai Tsai】
  16. 中学-知识与能力【8】
  17. 第三方推广——《互联网运营的知识体系与整体逻辑》笔记(十二)
  18. 毕设专题1 — 开始准备结束的任务
  19. 安装x86版 OS X的系统要求
  20. Shaders for Game Programmers and Artists(6) - 反射与折射

热门文章

  1. 用Cython加速Python到“起飞”
  2. mac 启动mysql 报错,mac 解决 mysql 启动报错
  3. 单片机c语言三种经典程序结构,单片机C语言程序的结构和设计精选.docx
  4. java xlsx怎么转换成excel格式_python小工具 | Excel的xls和xlsx格式文件转换
  5. 操作系统之I/O管理:3、设备的分配与回收(设备控制表DCT、控制器控制表COCT、通道控制表CHCT、系统设备表SDT、逻辑设备表LUT)
  6. C++多进程并发框架FFLIB
  7. kvm迁移镜像启动报错(the CPU is incompatible with host CPU: Host CPU does not provide required features: fma)
  8. Golang通道(chan,协程交互数据)
  9. 22. PE结构-PE详解之输入表(导入表)、屠龙刀W32Dasm(静态)、LordPE(动态)工具入门(查找dll、调用函数)
  10. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码