黑马Java面试笔记之Redis篇(使用场景)

article/2025/8/4 7:39:51

1.面试题

我看你做的项目中,都用到了redis,你在最近的项目中那些场景使用了redis呢

2.提问的底层逻辑

                面试官提问你这个问题一是想验证你的项目场景的真实性,二是为了作为深入发问的切入点

3.延伸出来的知识点

3.1 缓存

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

如果发生了缓存穿透、击穿、雪崩,该如何解决呢

3.1.1 缓存穿透

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

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

  • 优点:简单
  • 缺点:消耗内存,可能会发生redis和数据库不一致问题,比如根据数据库查询到数据为空,存入缓存,之后修改了数据库的数据,会导致不一致问题

解决方案二:布隆过滤器

当请求查询时,先在布隆过滤器中查询,如果过滤器中没有的话就直接返回

    布隆过滤器是依赖bitmap位图实现的,当存储数据时,通过函数获取hash在数据存储中对应的位置,然后把对应的数据由0改为1,如果对应值都为1,则说明存在,若有一个值不为1,则说明不存在

     位图因为只存储0和1,所以存储压力比较小

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

总结

1.Redis的使用场景

1)根据自己简历上的业务进行回答

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

3)分布式锁  setnx、redisson

2.什么是缓存穿透,怎么解决

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

2)解决方案一:缓存空数据

3)解决方案二:布隆过滤器


3.1.2 缓存击穿

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

解决方案一:互斥锁

  • 优点:强一致
  • 缺点:性能差

解决方案二:逻辑过期

        高可用、性能优

总结

1.缓存击穿

1)是什么:当某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

2)解决方案一:互斥锁,强一致,性能差

3)解决方案二:逻辑过期,高可用,性能优,不能保证数据绝对一致

3.1.3 缓存雪崩

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

解决方案:

  • 第一种大量key过期导致的,给不同的key的TTL添加随机值,使过期时间不一致
  • Redis宕机导致的:利用Redis集群提高服务的可用性,有哨兵模式,集群模式
  • 给缓存业务添加降级限流策略,在ngxin或者spring cloud gateway(微服务)
  • 给业务添加多级缓存,Guava或Caffeine
总结

缓存雪崩

1)缓存雪崩是指在同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力,与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存

2)解决方案主要是可以将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效事件

打油诗

3.1.4  双写一致性

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

redis作为缓存,mysql的数据如何与redis进行同步呢?

        一定要设置前提,先介绍自己的业务逻辑,有两种情况,一种是业务的一致性比较高,一种是允许延迟一致

实现强一致性的方法

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

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

  • 异步通知保证数据的最终一致性
  • 基于Canal的异步通知

总结

redis作为缓存,mysql的数据如何与redis进行同步呢?

1)介绍自己简历上的业务,我们当时是把文章的热点数据存入到了缓存中,虽然是热点数据。但是实时要求性没有那么高,所以,我们当时采用的是异步的方案同步的数据

2)我们当时是把抢券的库存放入到了缓存中,这个需要实时的进行数据同步,为了保证数据的强一致,我们当时采用的是redisson提供的读写锁来保证数据的同步

那你来介绍一下异步的方案(你来介绍一下redisson读写锁的这种方案)

  • 允许延时一致的业务,采用异步通知

  1. 使用MQ中间中间件,更新数据之后,通知缓存删除

  2. 利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存

  • 强一致性的,采用Redisson提供的读写锁
  1. 共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
  2. 排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作

3.1.5  持久化

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

        RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据

         RDB的执行原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件,fork采用的是copy-on-write技术:

  • 当主进程执行写操作时,访问共享内存
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

        AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

总结

面试官:redis作为缓存,数据的持久化是怎么做到的?

候选人:在redis中提供了两种数据持久化的方式:1、FDB   2、AOF

面试官:这两种持久化方式有什么区别呢?

候选人:RDB是一个快照文件,他是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据

AOF的含义是追加文件,当redis操作写命令时,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一边命令来恢复数据

面试官:这两种方式,哪肿恢复的比较快呢?

候选人:RDB因为是二进制文件,再保存的时候体积也是比较小的,他恢复的比较快,但是他又可能会丢失数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是他丢数据风险小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

3.1.6 数据过期策略

假如redis的key国过期之后,会立即删除吗?

        redis对数据设置数据的有效时间,数据国过期之后,就需要将数据从内存中删除掉,可以按照不同的规则进行删除,这种删除规则就被称为数据的删除策略,一种是惰性删除,一种是定期删除

惰性删除:设置该key过期时间后,我们不去管他,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉他,反之返回该key

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

总结

Redis的数据过期策略

  1. 惰性删除:访问key的时候判断是否过期,如果过期,则删除
  2. 定期删除:定期检查一定量的key是否过期(SLOW模式 + FAST模式)
  3. Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

3.1.7 数据淘汰策略

        当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略

假如缓存过多,内存是有限的,内存被占满了怎么办?

数据淘汰策略-使用建议

1.优先使用allkeys-lru策略。充分利用LRU算法的优势,把最近常访问的数据留在缓存中,如果业务有明显的冷热数据区分,建议使用

2。如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用allkeys-random,随机选择淘汰。

3.如果业务中有置顶的需求,可以使用volatile-lru策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据

4.如果业务中有短时高频访问的数据,可以使用allkeys-lfu或volatile-lfu策略。

其他面试问题


http://www.hkcw.cn/article/wMwweCVLBw.shtml

相关文章

PyTorch -TensorBoard的使用 (一)

设置环境 新建python文件 .py 安装Tensorboard 在终端进行安装 显示安装成功 两个logs,出现这种情况怎么解决 所有的logs文件删掉delete,重新运行 add_image 不满足要求 Opencv-numpy 安装Opencv add_image 用法示例 (500,375&am…

解决Ubuntu20.04上Qt串口通信 QSerialPort 打开失败的问题

运行Qt串口通信 open(QIODevice::ReadWrite) 时,总是失败。 1、打印失败原因 QString QSerialHelper::openSerail() {if(this->open(QIODevice::ReadWrite) true){return this->portName();}else{return "打开失败";//return this->errorStri…

[yolov11改进系列]基于yolov11引入迭代注意力特征融合iAFF的python源码+训练源码

【iAFF介绍】 1. IAFF(迭代注意力特征融合) iAFF通过引入多尺度通道注意力模块和迭代融合,更好的整合不同尺度和语义不一致的特征,有效解决特征融合问题,提高目标检测的精度。 特征融合,即不同层或分支的…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端,需要在controller类上加注解:ResponseBody; 这个注解其实在前面已经使用过,RestController其实就包含两个注解: Controller ResponseBody 返回值如果是实体对象/集合,将会转换为j…

idea中springboot2.7(由于步入另一个线程,已跳过 xxx 处的断点)

idea springboot2.7 debug 问题 springboot 2.7 debug 模式时引入 spring-boot-devtools 卡在代码中不往下执行&#xff0c;提示&#xff1a;由于步入另一个线程&#xff0c;已跳过 xxx 处的断点。 原因 springboot 2.7 引入 spring-boot-devtools <!-- debug时不推荐开…

ROS应用之如何配置RTOS满足机器人系统中的实时要求

如何配置RTOS以满足机器人系统中的实时要求 前言 实时操作系统&#xff08;RTOS&#xff09;在机器人系统中的应用至关重要&#xff0c;尤其在需要对环境变化做出快速反应的高精度控制系统中。ROS2作为开源机器人操作系统&#xff0c;为机器人提供了强大的框架和工具链&#x…

03 APP 自动化-定位元素工具元素定位

文章目录 一、Appium常用元素定位工具1、U IAutomator View Android SDK 自带的定位工具2、Appium Desktop Inspector3、Weditor安装&#xff1a;Weditor工具的使用 4、uiautodev通过定位工具获取app页面元素有哪些属性 二、app 元素定位方法 一、Appium常用元素定位工具 1、U…

数学分析——一致性(均匀性)和收敛

目录 1. 连续函数 1.1 连续函数的定义 1.2 连续函数的性质 1.2.1 性质一 1.2.2 性质二 1.2.3 性质三 1.2.4 性质四 2. 一致连续函数 2.1 一致连续函数的定义 2.2 一致连续性定理(小间距定理)(一致连续函数的另一种定义) 2.3 一致连续性判定法 2.4 连…

并发执行问题 (上)

S3和S4 没法区别 i存在 父进程数据区 子进程存在数据区 所以返回值不一样 通过返回值运行不一样的代码 原来的进程镜像作废,运行的执行新的elf文件

一周学会Pandas2之Python数据处理与分析-数据重塑与透视-pivot_table() - 透视表 (长 -> 宽,支持聚合)

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili pivot_table() 是 pandas 中最强大的数据透视工具&#xff0c;它不仅能重塑数据&#xff0c;还能进行复杂的数据聚合…

郑钦文抢七险胜萨姆索诺娃 首次闯进法网八强

6月1日,在2025年法国网球公开赛女单第四轮比赛中,赛会8号种子、中国选手郑钦文以2:1战胜俄罗斯选手萨姆索诺娃,首次闯进法网女单八强。这场比赛耗时2小时47分钟,双方在场上展开了激烈的争夺。首盘比赛双方陷入苦战,郑钦文通过更深的落点限制对手进攻,并且在多拍回合中展现…

robot_lab学习笔记【MDP综述】

文章目录 整体介绍第一部分第二部分第三部分总结 整体介绍 在robot_lab中的mdp文件夹下面包含6个文件&#xff1a;[init.py , commands.py , curiculums.py, events.py , observations.py , rewards.py ] 对每个部分的详细讲解在总结中会指向子链接 init.py文件的代码如下 …

Leetcode 2093. 前往目标城市的最小费用

1.题目基本信息 1.1.题目描述 一组公路连接 n 个城市&#xff0c;城市编号为从 0 到 n - 1 。 输入包含一个二维数组 highways &#xff0c;其中 highways[i] [city1i, city2i, tolli] 表示有一条连接城市 city1i 和 city2i 的双向公路&#xff0c;允许汽车缴纳值为 tolli 的…

【C++】模板与特化技术全面教程(claude sonnet 4)

第一章&#xff1a;模板的基础概念 (Template Fundamentals) 1.1 什么是模板&#xff1f; 模板 (Template) 是C中的一种泛型编程 (Generic Programming) 机制&#xff0c;它允许我们编写与类型无关的代码。想象一下&#xff0c;如果我们要为不同的数据类型编写相同逻辑的函数&a…

VBA数据库解决方案二十:Select表达式From区域Where条件Order by

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

【2025最新】Java图书借阅管理系统:从课程作业到实战应用的完整解决方案

【2025最新】Java图书借阅管理系统&#xff1a;从课程作业到实战应用的完整解决方案 目录 【2025最新】Java图书借阅管理系统&#xff1a;从课程作业到实战应用的完整解决方案**系统概述** **核心功能模块详解****1. 系统登录与权限控制****2. 借阅管理模块****3. 用户角色管理…

结合源码分析Redis的内存回收和内存淘汰机制,LRU和LFU是如何进行计算的?

Redis 内存回收 1. 过期 key 处理 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。我们可以通过修改配置文件来设置Redis的最大内存&#xff1a; 当内存使用达到上限时&#…

NLP学习路线图(十五):TF-IDF(词频-逆文档频率)

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;TF-IDF&#xff08;词频-逆文档频率&#xff09; 犹如一颗恒星&#xff0c;虽古老却依然璀璨。当ChatGPT、BERT等大模型光芒四射时&#xff0c;TF-IDF作为传统方法的代表&#xff0c;其简洁性、高效性与可解…

C++11(上)

历史&#xff1a; 在C98版本后&#xff0c;C11是一次大版本的更新。在C11中新增了许多有用的东西。接下来将由小编来带领大家介绍C11中新增的内容。 列表初始化: 在C中&#xff0c;列表初始化&#xff08;也称为统一初始化或花括号初始化&#xff09;是一种使用花括号 {} 来初…

从TCO角度分析IBM Cognos Analytics

一、总拥有成本&#xff08;TCO&#xff09;分析 像 Cognos Analytics 这样成熟的企业级 BI 平台&#xff0c;在与新兴的敏捷 BI 工具竞争中&#xff0c;依然能够保持其独特价值和竞争力的关键所在&#xff0c;尤其从企业和组织的长远发展、团队协作以及总拥有成本&#xff08…