面试(05)————Redis篇

目录

一、项目中哪些地方使用了redis

 问题一:发生了缓存穿透该怎么解决?

方案一:缓存空数据

方案二:布隆过滤器

模拟面试

问题二: 发生了缓存击穿该怎么解决?

 方案一:互斥锁

 方案二:逻辑过期 

 模拟面试

问题三: 发生了缓存雪崩该怎么解决?

问题四: redis作为缓存,mysql的数据如何redis进行同步?(双写一致性)

 这个时候我们就要考虑是先删除缓存,还是先修改数据库?

情况一:先删除缓存,再操作数据库

情况二:先操作数据库,再删除缓存

那么为什么要删除两次缓存? 

为什么要延时删除?

业务场景一:那怎么保证双写一致呐?(一致性要求高的业务需求)

 业务场景二:延迟一致怎么做?(允许短暂的不一致,实际开发中最为主流的)

方案一:基于MQ的异步通知

方案二:基于Canal的异步通知

 模拟面试

 问题五:redis作为缓存,数据的持久化是怎么做的?

 RDB

AOF

RDB与AOD对比 

模拟面试

​编辑 问题六:假设redis的key过期之后,会立即删除吗?(数据过期策略)

惰性删除 

定期删除 

模拟面试 

问题七: 假如缓存过多,内存是有限的,内存被占满了怎么办?(数据淘汰策略)

关于数据淘汰策略其他的面试问题?

1、数据库有1000万数据,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据?

2、Redis的内存用完了会发生什么?

模拟面试

问题八:redis分布式锁,是如何实现的?

情景模拟———抢券执行

redis分布式锁

Redis实现分布式锁如何合理的控制锁的有效时长?

redisson实现的分布式锁——执行流程

redisoon实现的分布式锁,是否可以重入呐?

redisson实现的分布式锁——主从一致性

模拟面试

问题九:redis集群有哪些方案?

 主从复制

主从全量同步

主从增量同步 (slave重启或后期数据变化)

模拟面试

 哨兵的作用

结构

作用

服务状态监控

Redis集群(哨兵模式)脑裂

模拟面试

分片集群结构

数据读写 

模拟面试

 总结

 问题十:Redis是单线程的,但是为什么还那么快?

能解释一下I/O多路复用 模型?

 用户空间和内核空间

阻塞IO

非阻塞IO

IO多路复用 

 Redis网络模型

模拟面试


以下问题包括知识点和面试题,看的时候直接看《模拟面试即可》,后续持续更新中。。。 

一、项目中哪些地方使用了redis

面试官:我看你做的项目中,都用到了redis,你在最近的项目中哪些场景使用了redis?

 一般这个问题要结合自己的实际项目经历回答,面试想这样问:一方面验证你的项目场景的真实性,二是为了作为深入发问的切入点

比如你回答了使用了:(可能会被问道的相关问题或知识点)

缓存:缓存三兄弟(穿透、击穿、雪崩)、双写一致、持久化、数据过期策略、数据淘汰策略
 

分布式锁:setnx、redisson
 

消息队列、延迟队列:何种数据类型

 问题一:发生了缓存穿透该怎么解决?

以下是正常使用缓存的流程:

那么什么是缓存穿透呐?

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

 那为什么会出现这种情况呐?

通常呐,就是有人恶意攻击你的系统,有人知道你的请求路径,知道你的请求参数跟在请求路径后面的,就会制造一些假的id发起请求等等,就会冲击你的数据库,你的数据库的并发是不高的,请求到了一定的量就会击垮数据库。

 解决方案:

方案一:缓存空数据

解决方案一:缓存空数据,查询返回的数据为空,仍把这个空数据进行缓存

优点:操作简单

缺点:消耗内存,可能会发生不一致的问题

方案二:布隆过滤器

 解决方案二:布隆过滤器

优点:内存占用较少,没有多余key

缺点:实现复杂,存在误判

布隆过滤器:


bitmap(位图):相当于一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1

布隆过滤器作用:布隆过滤器可以用于检索一个元素是否再一个集合中。

可能产生误判:

误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多的内存消耗

模拟面试

问题二: 发生了缓存击穿该怎么解决?

什么是缓存击穿?

给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮

 解决方案:

 方案一:互斥锁

特点:强一致,性能差

 方案二:逻辑过期 

特点:高可用、性能优、不能保证数据的绝对一致

 模拟面试

问题三: 发生了缓存雪崩该怎么解决?

什么是缓存雪崩?

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

解决方案:

  • 给不同的key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略  (降级可作为系统的保底策略,适用于穿透、击穿、雪崩)
  • 给业务添加多级缓存

 模拟面试:

问题四: redis作为缓存,mysql的数据如何redis进行同步?(双写一致性)

一定要设置前提,,,结合自己的项目业务背景去讲!!!!

看看到底属于哪一种:是一致性要求高的业务需求,还是说是允许延迟一致?

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

读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间

写操作:延迟双删 

 这个时候我们就要考虑是先删除缓存,还是先修改数据库?

情况一:先删除缓存,再操作数据库

正常情况:

不正常情况:因为线程是交替执行的,这种方式可能会出现脏数据的现象

情况二:先操作数据库,再删除缓存

正常情况:

不正常情况:这种方式可能会出现脏数据的现象

那么为什么要删除两次缓存? 

降低脏数据的出现

为什么要延时删除?

业务场景一:那怎么保证双写一致呐?(一致性要求高的业务需求)

但是这样的话,性能就有点差了

当然我们都是知道的,放入redis的数据一般都是读多写少

所以使用读写锁就可以了

特点:强一致,性能差(强一致性情况下才会使用)

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作

排他锁:独占锁writeLock,加锁之后,阻塞其他线程读写操作

 业务场景二:延迟一致怎么做?(允许短暂的不一致,实际开发中最为主流的)

方案一:基于MQ的异步通知

方案二:基于Canal的异步通知

 模拟面试

强一致性回答:

最终一致性回答:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值