首页 > 其他分享 >八股文笔记(持续更新)

八股文笔记(持续更新)

时间:2024-07-14 19:54:48浏览次数:17  
标签:面试官 缓存 八股文 过期 redis 更新 笔记 key 数据

提示:本笔记基于【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】https://www.bilibili.com/video/BV1yT411H7YK?p=7&vd_source=a91dafe0f846ad7bd19625e392cf76d8 总结

面试

职业技能

image-20240620102225923

总结

image-20240620102746627

如何找的合适的项目image-20240620103121793

项目模块的深度学习image-20240620103143720

如何深入学习项目image-20240620104748910

Redis

image-20240620104313677

面试官可能提问的问题:看你做的项目中,都用到了redis,你最近的项目中哪些场景使用了redis。

结合项目中的业务回答

目的:一是验证你的项目场景的真实性,二_是为了作为深入发问的切入点
image-20240620110617038

缓存

缓存穿透

正常情况

image-20240620110806827

缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库

解决方案一

缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存
优点:简单
缺点:消耗内存,可能会发生不一致的问题

解决方案二

image-20240620111852445

布隆过滤器

image-20240620112131388

会有误判image-20240620112322637

优点:内存占用较少,没有多余key
缺点:实现复杂,存在误判

面试官:什么是缓存穿透 ? 怎么解决 ?

候选人:

嗯~~,我想一下

缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写

入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致

DB 挂掉。这种情况大概率是遭到了攻击。

解决方案的话,我们通常都会用布隆过滤器来解决它

面试官:好的,你能介绍一下布隆过滤器吗?

候选人:

嗯,是这样~

布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是

redisson实现的布隆过滤器。

它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一

开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据

的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一

个key的存在。查找的过程也是一样的。

当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置

这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增

加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能

接受,不至于高并发下压倒数据库。

面试官:什么是缓存击穿 ? 怎么解决 ?

候选人:

嗯!!缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时

候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过

期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能

会瞬间把 DB 压垮。

解决方案有两种方式:

第一可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的

setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓

存,否则重试get缓存的方法

第二种方案可以设置当前key逻辑过期,大概是思路如下:

①:在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前

key设置过期时间

②:当查询的时候,从redis取出数据后判断时间是否过期

③:如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据,

这个数据不是最新

当然两种方案各有利弊:

如果选择数据的强一致性,建议使用分布式锁的方案,性能上可能没那么

高,锁需要等,也有可能产生死锁的问题

如果选择key的逻辑删除,则优先考虑的高可用性,性能比较高,但是数据

同步这块做不到强一致。

缓存击穿

缓存击穿:给某-个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

image-20240713193239635

解决方案一

互斥锁

image-20240713193438564

保证 数据强一致性

性能差

解决方案二

逻辑过期

image-20240713193802329

总结

image-20240713193853243

面试官:什么是缓存击穿 ? 怎么解决 ?

候选人:

嗯!!缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时

候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过

期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能

会瞬间把 DB 压垮。

解决方案有两种方式:

第一可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的

setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓

存,否则重试get缓存的方法

第二种方案可以设置当前key逻辑过期,大概是思路如下:

①:在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前

key设置过期时间

②:当查询的时候,从redis取出数据后判断时间是否过期

③:如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据,

这个数据不是最新

当然两种方案各有利弊:

如果选择数据的强一致性,建议使用分布式锁的方案,性能上可能没那么

高,锁需要等,也有可能产生死锁的问题

如果选择key的逻辑删除,则优先考虑的高可用性,性能比较高,但是数据

同步这块做不到强一致。

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或则Redis服务宕机,导致大量请求到达数据库,带来巨大压力

image-20240713194200340

解决方案

给不同的key的TTL添加随机值

利用Redis集群提高服务的可用性:哨兵模式、集群模式

给缓存业务添加降级限流策略:ngxin或spring cloud gateway

给业务添加多级缓存:Guava或Caffeine

总结

image-20240713194506062

面试官:什么是缓存雪崩 ? 怎么解决 ?

候选人:

嗯!!

缓存雪崩意思是设置缓存时采用了相同的过期时间,导致缓存在某一时刻同

时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:

雪崩是很多key,击穿是某一个key缓存。

解决方案主要是可以将缓存失效时间分散开,比如可以在原有的失效时间基

础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重

复率就会降低,就很难引发集体失效的事件。面试官:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致

性)

候选人:嗯!就说我最近做的这个项目,里面有xxxx(根据自己的简历上

写)的功能,需要让数据库与redis高度保持一致,因为要求时效性比较高,

我们当时采用的读写锁保证的强一致性。

我们采用的是redisson实现的读写锁,在读的时候添加共享锁,可以保证读

读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读写,读

读都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免

了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。

双写一致

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库要保持一致

image-20240713194947658

  • 读操作:缓存击中,直接返回;缓存未击中查询数据库,写入缓存,设置超时时间
  • 写操作:延迟双删

image-20240713195657226

image-20240713195528026

都可能会出现问题

解决办法1

添加分布式锁

强一致、性能低

image-20240713195807243

解决办法2

异步通知

image-20240713200118800

基于Canal的异步通知

image-20240713200220829

总结

image-20240713200452200

面试官:那这个排他锁是如何保证读写、读读互斥的呢?

候选人:其实排他锁底层使用也是setnx,保证了同时只能有一个线程操作

锁住的方法

面试官:你听说过延时双删吗?为什么不用它呢?

候选人:延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新

数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在

延时的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用它。

面试官:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致

性)

候选人:嗯!就说我最近做的这个项目,里面有xxxx(根据自己的简历上

写)的功能,数据同步可以有一定的延时(符合大部分业务)

我们当时采用的阿里的canal组件实现数据同步:不需要更改业务代码,部署

一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据

更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,

的数据,其中这个延时多久不太好确定,在

延时的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用它。

面试官:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致

性)

候选人:嗯!就说我最近做的这个项目,里面有xxxx(根据自己的简历上

写)的功能,数据同步可以有一定的延时(符合大部分业务)

我们当时采用的阿里的canal组件实现数据同步:不需要更改业务代码,部署

一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据

更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,

更新缓存即可。

标签:面试官,缓存,八股文,过期,redis,更新,笔记,key,数据
From: https://blog.csdn.net/fjdjdj1/article/details/140421801

相关文章

  • Reinforced Causal Explainer for GNN论文笔记
    论文:TPAMI2023 图神经网络的强化因果解释器论文代码地址:代码目录AbstractIntroductionPRELIMINARIESCausalAttributionofaHolisticSubgraph​individualcausaleffect(ICE)​*CausalScreeningofanEdgeSequenceReinforcedCausalExplainer(RC-Explaine......
  • java_day1学习笔记
    title:Java_Day_1学习笔记data:2024-07-09tags:Java学前简述学习方法为什么学?技术控?项目需求?作业要求?方法?现有技术能解决?现有技术能完美解决?新技术和知识点?根据需求有针对点的学习怎么学?基本原理和基本语法(不考虑细节,快速过一遍),不要先考虑细节,因为细......
  • 失败笔记本--OPENCV--001--202407
    失败笔记本-OPENCV篇-001项目场景:今天研究一下用OPENCV基于轮廓分析查找数字,参考地址为:OpenCV案例|基于轮廓分析查找数字实现的效果如下:1.打开一张图片步骤:首先呢还是丝滑小连招,打开图片,灰度化,二值化在opencv中使用imread打开图片,使用imshow展示图片,不过要注意在ims......
  • Java笔记之HashMap
    HashMap的实现原理HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap底层就是一......
  • Java笔记之ThreadLocal
    定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。原理:Thread类有一个类型ThreadLocalMap的实例变量ThreadLocals,每个线程都有一个......
  • 《项目管理》-笔记2
    1.项目集定义项目集是一组相互关联且被协调管理的项目、子项目集和项目集活动,以便获得分别管理所无法获得的利益。项目集有三个核心特征:(1)多个项目(2)统一战略目标(3)统一配置资源项目组合管理利用了MPT的概念,并且也应用了三个关键评估标准来衡量项目:项目承担的成本、存在的风险......
  • CSS 样式缓存不更新
    来自......
  • HarmonyOS NEXT 学习笔记3--登录页面(数据绑定)
    1.代码:import{promptAction}from'@kit.ArkUI'@Entry@ComponentstructPage_textInput_onchange{//@StateUI刷新测试[注意:不是双向绑定]username:string=''password:string=''build(){Column({space:20}){......
  • 关于51单片机LED板块的学习笔记
    首先看看常见LED灯的内部结构其次下面是MCU原理图上关于LED的部分右侧VCC代表正极,左接两组电阻,目的保护电路,然后是八个LED,左侧有P20到P27八个接口接到下图CPU的对应接口上。这是工作原理图CPU经过一系列的信号传输把信号以高低电平的形式传给LED,因为LED右端始终接正极V......
  • [rCore学习笔记 015]特权级机制
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有官方文档仍然是一上来就丢出来的官方文档.只摘抄了我觉得有意思的部分:实现特权级机制的根本原因是应用程序运行的安全性不可充分信任......