《对线面试官》| 高频 Redis 面试题(上)

news/2024/5/14 6:24:30/文章来源:https://blog.csdn.net/s_alted/article/details/127387964

目录

    • 前言
    • 百分之99面试官都爱问的 Redis 面试题
      • 1、谈下你对 Redis 的了解
      • 2、Redis适用于哪些场景?不适用于哪些场景?
      • 3、Redis 支持的数据类型有哪些?
      • 4、既然Redis是单线程架构,但为什么这么快?
      • 5、什么是缓存穿透?怎么解决?
      • 6、什么是缓存雪崩?该如何解决?
      • 7、Redis 持久化机制有哪几种
      • 8、在进行RDB持久化时,Redis 可以处理写请求吗
      • 9、谈谈 Redis 的内存回收机制吧
      • 10、谈谈 Redis 的键过期机制吧
      • 11、同一时间大量 key 都过期的话会有什么影响?
      • 12、slave是怎么实现键过期策略的?

前言

这个公众号运营了一年多了(算上自己摆烂的那大半年),跟大家分享过运维人员是如何排查定位问题的,也分享过自己的一些学习笔记


请添加图片描述

今天打算新开一个系列,叫《对线面试官》(暂时就想到这个名字)请添加图片描述

今天打算新开一个系列,叫**《对线面试官》**(暂时就想到这个名字)

在《对线面试官》里,我会跟大家分享一下校招面试过程中面试官比较爱问的问题

这些面试题虽然比较基础,但是涉及的知识面比较广,很能体现出面试人的技术水准以及能否对自己所学的知识加以思考与总结

当然也不缺乏一些深度的面试题,要是在面试过程中全部对答如流的话是很加分的哦!

请添加图片描述

废话不多说,开始《对线面试官》系列的第一篇文章!

(PS:最近忙着准备转正答辩,文章更新速度会放缓一下下)

百分之99面试官都爱问的 Redis 面试题

1、谈下你对 Redis 的了解

Redis 是一个用 C 语言编写的、开源的 key-value 数据库
Redis 运行在内存中,所以处理数据的速度非常快,同时 Redis 还支持数据的持久化,将内存中的数据 保存在磁盘

2、Redis适用于哪些场景?不适用于哪些场景?

适用的场景:

  1. 会话缓存:减轻后端 sql 数据库的 IO 压力,提升系统性能
  2. 排行榜:利用 sortset(有序集合)可以排序且不能有重复数据的特性来实现
  3. 消息队列:redis 支持生产者/消费者模式、发布者/订阅者模式的消息队列

不适用场景:

  1. 数据量太大的业务场景,内存成本大
  2. 数据访问频率非常低的业务场景,浪费内存资源

3、Redis 支持的数据类型有哪些?

  1. string(字符串)
    字符串类型是redis最基础的数据结构,而且其他集中数据结构都是在字符串类型基础上构建的
  2. Hash(哈希)
    Redis中哈希类型是指键本身是一种键值对结构
  3. List(列表)
    列表(list)类型是用来存储多个有序的字符串,是一种线性结构可以充当栈和队列的角色
  4. Set(集合)
    集合(set)类型也是用来保存多个的字符串元素,集合中不允许有重复出现的元素 集合的元素是无序的,不能够通过下标来获得值
  5. zset(即sotred set:有序集合)
    有序集合保留了集合不能有重复成员的特性,不同的是有序集合中的元素是可以排序的。和列表使用索引下标作为排序依据不同的是它给每个元素设置一个分数(score)作为排序的依据

4、既然Redis是单线程架构,但为什么这么快?

1、Reids 的数据都是存放在内存中的,绝大部分请求都是对内存进行操作,所以非常快
2、Redis 采用 epoll 作为 I/O 多路复用技术的实现,结合非阻塞 I/O 模型
3、除此之外,Redis 的自身事件处理模型将 epoll 中的连接、读写、关闭都转换成一个个事件,因此不会在网络 I/O 上浪费过多时间
4、Redis 的单线程架构避免了不必要的因上下文切换、多线程资源竞争所导致的资源消耗,更加快速

5、什么是缓存穿透?怎么解决?

  • 缓存穿透
    是指当去查询一个不存在的数据时,会因为缓存不命中而去数据库中查询
    如果出现高并发的去查询一个不存在的数据,就会导致这个不存在的数据每次请求都会到数据库中查询,造成缓存穿透
    PS:穿透,相当于穿过 Redis 直接打到后端数据库上
  • 解决方法
    1、将空数据缓存
    如果查询一个数据返回了空值(不管是数据不存在的原因还是系统故障的原因),仍然把这个空结果缓存起来,并设置过期时间
    2、布隆过滤器

将所有可能存在的数据哈希到一个足够大的bitmap 中,一定不存在的数据会被这个 bitmap 直接拦截掉,从而避免对数据库的查询

6、什么是缓存雪崩?该如何解决?

  • 缓存穿透
    是指数据缓存在某一段时间内集中失效,发生了大量的缓存穿透,导致所有的查询请求都打到数据库上,造成了缓存雪崩
  • 解决方法

1、加锁排队

缓存失效后,通过加锁或者队列来控制对数据库进行操作的线程数量,从而避免数据库压力过大

2、数据预热
通过缓存 reload 机制,预先刷新缓存,在即将发生大并发访问前手动触发缓存,并设置不同的过期时间

3、二级缓存(双缓存)策略
Cache1 为原始缓存,Cache2 为拷贝缓存,Cache1 失效时,可以访问 Cache2,Cache1 缓存失效时间设置为短期,Cache2 设置为长期

4、其他

除此之外,还可以在缓存的时候给过期时间加上一个随机值,这样就会大幅度地减少缓存在同一时间过期

7、Redis 持久化机制有哪几种

Redis 是将数据运行在内存中的,如果出现服务挂掉或者服务器宕机都可以导致数据全部丢失

为了解决 这个问题 redis 提供了两种数据持久化机制——RDB、AOF
RDB

  • RDB 是 Redis DataBase 的缩写
  • RDB 按照一定时间间隔把内存中的数据以快照的形式(dump.rdb)保存到磁盘中
  • 触发 RDB 持久化过程为手动触发和自动触发
    • 手动触发:save 命令或 bgsave 命令
    • 自动触发:配置文件添加 save 字段

AOF

  • AOF 是 Append-only file 的缩写
  • Redis 会将每一个收到的写命令都追加到 AOF 文件末尾,类似于 MySQL 的 binlog,Reids重启后会通过重新执行 AOF 文件中的写命令来实现数据的恢复
  • 通过在配置文件里添加 appendonly yes 字段来开启 AOF

RDB 和 AOF 的区别

  • RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中
  • 如果 RDB 和 AOF 都配置了,那么优先采用 AOF
  • AOF 提供了多种数据同步频率,最多丢失 1 秒的数据而已,RDB是隔一段时间进行持久化,所以说 AOF 的数据安全性要比 RDB 高
  • -对于具有相同数据的的 Redis,AOF 文件通常会比 RDB 文件体积更大

8、在进行RDB持久化时,Redis 可以处理写请求吗

可以,Redis 使用操作系统的多进程写时复制技术 COW(Copy On Write) 来实现快照持久化,保证数据 一致性

Redis 在 RDB 持久化时会 fork 出一个子进程,由子进程来负责持久化,而父进程继续处理客户端请求

当父进程收到客户端的写请求时,就会将数据复制一份传给子进程,子进程将副本数据写到 RDB 文件里

9、谈谈 Redis 的内存回收机制吧

Redis是基于内存的数据库,常被用作缓存,以此来提高系统的响应速率与性能

因此在一些业务场景中往往会出现 Redis 消耗了大量的内存,导致系统出现性能瓶颈,为此 Redis 提供了内存回收机制(Redis默认采用noeviction策略)


请添加图片描述

  • volatile-lru:
    在设置了过期时间的所有键中,选取最近最少使用的数据删除

  • volatile-lfu:
    在设置了过期时间的所有键中,选取最近最不常用,也就是一定时期内被访问次数最少的数据删除

  • volatile-random:
    筛选出设置了过期时间的键值对,随机删除。

  • volatile-ttl:
    筛选出设置了过期时间的键值对,越早过期的越先被删除。

  • allkeys-lru:
    在所有键中,选取最近最少使用的数据删除

  • allkeys-lfu:
    在所有键中,选取最近最不常用,也就是一定时期内被访问次数最少的数据删除

  • allkeys-random:
    采用随机淘汰策略删除所有的键值对,这个策略不常用。

  • noeviction:
    不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,而做写操作,它将返回错 误,也就是说,当Redis采用这个策略内存达到最大的时候,它就只能读不能写了

10、谈谈 Redis 的键过期机制吧

除了 Redis 的内存回收机制可以有效解决消耗内存过高的问题

还有一个键过期机制,通过给 key 设置一个过期时间,超过过期时间后 key 就会被删除,内存就被回收
Redis key 过期处理的方式有三种:

  • 惰性删除
    不管 key 有没有过期都不主动删除,等到每次去获取 key 时再判断是否过期,如果过期就删除该 key ,否则返回 key 对应的值。这种策略对内存不够友好,可能会浪费很多内存
    **缺点:**若大量的 key 在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的数据占用了大量的内存)
  • 定时删除
    给 key 设置了过期时间后,会为该 key 创建一个定时器
    让定时器在 key 的过期时间来临时, 对 key 进行删除

**缺点:**定时器的创建耗时,若为每一个设置过期时间的 key 创建一个定时器(将会有大量的定时器 产生),性能影响严重,因为每个定时器都会占用一定的 CPU 资源

  • 定期删除
    系统每隔一段时间就定期扫描一次,发现过期的键就进行删除
    以下两种方式可以触发定期删除:
    1、配置redis.conf 的 hz 选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,对 Redis性能损耗也越大)
    2、配置内存回收策略,当 Redis 消耗内存达到最大内存使用限制,就会自行对应的策略,来对过期 key 进行删除

在 Redis 当中,其选择的是策略 2 和策略 3 的综合使用
不过 Redis 的定期删除只会扫描设置了过期时间的 key,因为设置了过期时间的键 Redis 会单独存储,所以不会出现扫描所有 key 的情况

11、同一时间大量 key 都过期的话会有什么影响?

  • 读写请求响应时间变长
    当 key 过期后,内存管理器需要对 key 占用的内存进行回收,会产生一定的 CPU 消耗
    大量的 key 过期会导致频繁回收内存,消耗 CPU 资源,导致系统响应变慢
  • 缓存雪崩
    缓存失效后导致所有的查询操作都落在数据库上,造成了缓存雪崩,甚至严重会导致数据库发生故障

12、slave是怎么实现键过期策略的?

slave 不会进行过期扫描, slave 对过期 key 的处理是被动的
当 master 采用定期或惰性删除过期 key 时,会同步一个 del 操作到 slave,这样 slave 也可以删除过期 key

RDB对过期Key的处理

  • 持久化数据到RDB文件

    • 持久化之前会检查 key 是否过期,过期的 key 不进入RDB文件
  • 从RDB文件恢复数据

    • 数据载入数据库之前,会对 key 进行过期检查,如果过期则不导入数据库(主库)
    • 如果 RDB 文件里有过期的键,那还是会载入,但是主从在数据同步时(全量复制),slave的数据会被清空(丢弃原先所有数据),所以不影响

AOF对过期Key的处理

  • 持久化数据到 AOF 文件
    • 如果某个 key 过期,还没有被删除,该 key 是不会进入 aof 文件的,因为没有发生修改命令
    • 当 key 过期被删除后,就会向 aof 文件追加一条 del 命令(在将来的以 aof 文件恢复数据的时候该过期的键就会被删掉)
  • AOF重写
    • 重写时,会先判断 key 是否过期,已过期的 key不会重写到 aof 文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_25422.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

星巴克急了,瑞幸就稳了?

(图片来源于网络,侵删) 文|螳螂观察 作者|易不二 新消费下行,但咖啡赛道却异常拥堵。 Manner正在不亦乐乎玩联名、Tims中国进入上市倒计时、茶颜悦色挤进了咖啡市场、幸运咖开始反攻一线...... 跨界的玩家们就更是从四面八方…

【Shell篇三】Shell数组

文章目录一、Shell数组的定义二、Shell数组的常用操作三、Shell数组的增删改查四、Shell数组的遍历一、Shell数组的定义 Bash Shell只支持一维数组定义时使用圆括号,元素用空格分开初始化数组时不需要定义数组的大小 eg: array(A 1 B "C" 3) array2()也…

voron 2.4 皮带张紧度调节

相关视频 【浅谈一下Voron2.4打印机,让入门者有个清晰的定位和了解】https://www.bilibili.com/video/BV1KL4y1N76C?share_source=copy_web&vd_source=4df36574d866076e5078105782af91de Z轴AB轴

(01)ORB-SLAM2源码无死角解析-(64) BA优化(g2o)→闭环线程:Optimizer::OptimizeSim3→Sim3变换优化

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下: (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196 文末正…

白名单里的蓝桥杯“计算思维”竞赛到底考啥,有啥用处?

可能很多人都已经知道了,教育部公布的《2022-2025学年面向中小学生的全国性竞赛活动名单》正式宣告了,蓝桥杯全国软件和信息技术专业人才大赛成为了白名单比赛中的一员了。 而根据蓝桥杯的竞赛说明,2023年4月15~16日,以及4月22~2…

微信对接百度实现文字识别OCR

微信对接百度实现文字识别OCR 前置基础条件: ①注册测试账号 ②开通自己的测试公众号 ③完成与微信互发消息 ④完成自定义菜单栏 详细步骤:https://blog.csdn.net/weixin_45565886/category_12059118.html 1 获取到百度文字识别API ①注册百度智能云账…

Tomcat修改端口、添加域名访问

一、修改改端口 1、修改默认访问端口8080,改为80 # vim /usr/local/tomcat/conf/server.xml (路径是自己的安装目录)<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=&…

spring 原理解析

spring 要解决的问题 1.spring 是如何创建一个bean对象的 bean对象其实就是一个实例 无非通过一些当时来丰富这个对象的内容 典型的就是aop和依赖注入 spring在通过构造方法创建一个实例对象后 就进入一个aop的阶段&#xff0c;这个阶段来实现属性 参数的依赖注入&#xf…

自然资源部第三地理信息制图院与Bigemap强强联手,共同推动多元化新GIS应用

近日&#xff0c;成都比格图数据处理有限公司(以下简称&#xff1a;Bigemap)与自然资源部第三地理信息制图院正式达成战略合作&#xff0c;未来双方将共同推动"基于矢量、影像、地形、实景三维等GIS数据在行业上的深化应用及国产化替代"合作。 自然资源部第三地理信…

小程序技术可助力智慧医疗企业破茧突围?

智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来爆发期。智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来…

基于java的果蔬在线销售系统/农产品销售系统

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

8-3 通过Grafana展示Prometheus的Node和Pod数据

文章目录前言Node数据node-exporter指标数据Prometheus采集node-exporter数据Grafana展示node-exporter数据导入模板Pod数据cadvisor指标数据Prometheus采集cadvisor数据Grafana展示cadvisor数据导入模板修改名字前言 在上一章节 8-2 通过Node-Exporter和Cadvisor收集指标数据…

多种点击试剂PEG:DBCO-PEG24-Maleimide, DBCO-PEG12-Mal性质总结

●中文名&#xff1a;二苯并环辛炔-PEG24-马来酰亚胺、二苯并环辛炔-二十四聚乙二醇-马来酰亚胺 ●英文&#xff1a;DBCO-PEG24-Maleimide&#xff0c;DBCO-PEG24-Mal ●外观以及性质&#xff1a;浅黄色或无色油性&#xff0c;西安凯新生物科技有限公司供应的​DBCO系列产品包…

MybatisPlus二级缓存不失效原因(缓存与数据库不一致)

​&#x1f4d2;个人主页&#xff1a;热爱生活的李&#x1f4d2; ​❤️感谢大家阅读本文&#xff0c;同时欢迎访问本人主页查看更多文章​❤️ &#x1f62d;技术太菜了希望下次不要出现了&#x1f62d; &#x1f64f;本人也在学习阶段&#xff0c;如若发现问题&#xff0c;请…

idea中的翻译插件(Translation)出现TKK不可用

idea中的翻译插件&#xff08;Translation&#xff09;不可用 1、问题&#xff1a; 在使用idea中的翻译插件时出现了下面的错误 2、解决方案 2-1、可以选择除谷歌外的 其他三个翻译软件 注意&#xff1a;我 试了一下 有道的 &#xff0c;申请了一个发现&#xff0c;这个并…

透明Png黑白图片上色(重新着色、改变成指定颜色)

场景&#xff1a;有时&#xff0c;我们需要给透明Png黑白图片改变成指定颜色&#xff08;上色&#xff09;。 前提&#xff1a;我们已经做好了带透明通道的PNG图片。 益处&#xff1a;使用此方法&#xff0c;只需要制作一张透明的黑色PNG图片即可&#xff0c;我们需要不同颜色…

UnRaid设备共用其他UnRaid主UPS的详细设置方法

系列文章目录 UnRaid系统添加UPS功能系列文章 第一篇&#xff1a;UnRaid主机连接UPS的设置方法简介 第二篇&#xff1a;UnRaid设备共用其他UnRaid主UPS的详细设置方法&#xff08;本文&#xff09; 第三篇&#xff1a;UnRaid设备共用群晖UPS的详细设置方法 文章目录系列文章目录…

Flutter基础组件:开关、进度组件、图片组件、图标组件

前言 刚开始学习&#xff0c;主要是为了熟悉一下组件的基本用法。参考 Flutter | 老孟 开关 Switch Switch(value: isOpen,onChanged: (value) {setState(() {isOpen value;});})添加图片 Switch(value: isOpen,activeThumbImage: const AssetImage(lib/assets/img/qq.png…

【无人机】基于EKF、UKF、PF、改进PF滤波算法的无人机航迹预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

Linux vmalloc原理与实现

文章目录前言一、vmalloc 原理1.1 vmalloc space1.2 vmalloc实现1.3 __vmalloc_node_range1.3.1 __get_vm_area_node1.3.2 __vmalloc_area_node1.3.3 map_vm_area二、数据结构2.1 struct vm_struct2.2 struct vmap_area三、vmalloc初始化总结参考资料前言 物理上连续的内存映射…