Redis 常见面试题汇总(持续更新)

文章目录

    • 01、Redis 支持哪些数据类型?
    • 02、谈谈对 Redis 的 AOF 机制的 rewrite 模式的理解?
    • 03、请列举几个 Redis 常见性能问题和解决方案
    • 04、Redis 使用的最大内存是多少?内存数据淘汰策略有哪些?
    • 05、请谈谈 Redis 的同步机制。
    • 06、谈谈对 Redis 哈希槽的理解。
    • 07、什么是缓存雪崩?
    • 08、什么是缓存击穿?
    • 09、什么是缓存预热?
    • 10、如何进行缓存更新?
    • 11、如何进行缓存降级?
    • 12、如何缓存热点 Key?
    • 13、什么是NoSQL数据库?
    • 14、NoSQL和RDBMS有什么区别?
    • 15、在哪些情况下使用和不使用NoSQL数据库?
    • 14、非关系型数据库有哪些?

01、Redis 支持哪些数据类型?

答:Redis 支持五种基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)及 ZSet(Sorted Set 有序集合)。还支持 HyperLogLog、Geo、BitMap、Pub/Sub 等数据结构,此外还有 BloomFilter,RedisSearch、Redis - ML 等。

  • HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。HyperLogLog 只会根据输入元素来计算基数,而不会存储输入元素本身。
  • Geo 用于地理位置的存储和计算,Redis3.2 版本开始提供此功能。
  • BitMap 实际上不是特殊的存储结构,其本质上是二进制字符串,可以进行位操作,其经典应用场景之一是日活跃用户统计。

02、谈谈对 Redis 的 AOF 机制的 rewrite 模式的理解?

答:rewrite 模式的作用就是缩小 AOF 持久化文件的体积。由于 AOF 持久化会对每一个写操作进行日志记录,在访问量时大时文件体积会迅速膨胀,这就需要通过 rewrite 模式来缩小文件体积。

rewrite 会像 replication 一样,创建(fork)出一个子进程,以及创建一个临时文件,遍历当前内存数据库中的所有数据,输出到临时文件。在 rewrite 期间的写操作会保存在内存的 rewrite buffer 中,当 rewrite 成功后这些操作也会复制到临时文件中,在最后用临时文件替代 AOF 文件。

触发 rewrite ,是文件大小达到临界点时发生。这个临界点是在 Redis 配置文件 Redis.conf 中配置,相关有两个参数:auto - aof - rewrite - percentageauto - aof - rewrite - min - size 参数。当前 AOF 文件体积大于 auto - aof - rewrite - min - size ,同时 AOF 文件体积的增长率大于 auto - aof - rewrite - percentage 时,会自动触发 AOF 的 rewrite 模式。当然也可手动调用 startAppendOnly 函数来触发 rewrite

以上情况在 AOF 打开的情况下发生,如果 AOF 是关闭的,那么 rewrite 操作可以通过 bgrewriteaof 命令来进行。

03、请列举几个 Redis 常见性能问题和解决方案

答:这里列举几个常见的性能问题如下:

  • 1)Master 最好不要做 RDB 持久化,因为这时 save 命令会调度 rdbsSave 函数,会阻塞主线程的工作,当数据量比较大时可能造成主线程长时间间断性暂停服务。
  • 2)如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒一次。
  • 3)为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网中。
  • 4)尽量避免在运行压力很大的主库上增加从库。
  • 5)主从复制不要用图状结构,用单向链表结构更为稳定,即:Master→Slave1→Slave2→Slave3… 。这样的结构方便解决单点故障问题,实现 Slave 对 Master 的替换。如果 Master 崩溃,可以立即启用 Slave1 替换 Master,其他不变。

04、Redis 使用的最大内存是多少?内存数据淘汰策略有哪些?

答:在 Redis 中,最大使用内存大小由 Redis.conf 中的参数 maxmemory 决定。默认值为 0,表示不限制,这时实际相当于当前系统的内存。但如果随着数据的增加,如果对内存中的数据没有管理机制,那么数据集大小达到或超过最大内存的大小时,则会造成 Redis 崩溃。因此需要内存数据淘汰机制。

Redis 淘汰策略配置参数为 maxmemory - policy,默认为 volatile - lru,Redis 总共提供了 6 种数据淘汰策略。

  • 1)volatile - lru:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  • 2)volatile - ttl:从已设置过期时间的数据集中挑选最近使用的数据集淘汰。
  • 3)volatile - random:从已设置过期时间的数据集中任意选择数据淘汰。
  • 4)allKeys - lru:从数据集中挑选最近最少使用的数据淘汰。
  • 5)allKeys - random:从数据集中任意选择数据淘汰。
  • 6)no - eviction(驱逐):禁止驱逐数据,这是默认的策略。

如果 AOF 已开启,Redis 淘汰数据时也会同步到 AOF。
说明一下:volatile 开头表示是对已设置过期时间的数据集淘汰数据,allKeys 开头表示是从全部数据集淘汰数据,后面的 lru、ttl、random 表示的是不同的淘汰策略,no - eviction 是永不回收的数据集合。关于 lru 策略,需要说明的是,Redis 中并不会准确的删除所有键中最近最少使用的键,而是随机抽取 5 个键(个数由参数 maxmemory - samples 决定,默认值是 5),删除这 5 个键中最近最少使用的键。

这里也介绍一下使用淘汰策略的规则:

  • 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allKeys - lru
  • 如果数据呈现等分布,也就是所有的数据访问频率大体相同,则使用 allKeys - random

05、请谈谈 Redis 的同步机制。

答:Redis 的主从同步分为部分同步(也叫增量同步)和全量同步。Redis 会先尝试进行增量同步,如不成功,则 Slave 进行全量同步。如果有需要,Slave 在任何时候都可以发起全量同步。

Redis 增量同步是指 Slave 初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量同步的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

Redis 全量同步一般发生在 Slave 初始化阶段,这时 Slave 需要对 Master 上的所有数据做全量同步。全同步结束后,也就是配置好主从后,Slave 连接到 Master,Slave 都会发送 PSYNC(即增量同步)命令到 Master。

如果是重新连接,且满足增量同步的条件,那么 Redis 会将内存缓存队列中的命令发给 Slave,完成增量同步。否则进行全量同步。

06、谈谈对 Redis 哈希槽的理解。

答:Redis Cluster 提供了自动将数据分散到不同结点的能力,但采取的策略不是一致性 hash,而是哈希槽。Redis 集群将整个 key 的数值域分成 16384 个哈希槽,每个 Key 通过 CRC16 校验后对 16384 取模来决定放置到哪个槽,集群的每个结点负责一部分哈希槽。

文章:Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案,该文章对这三个问题作了详细解释。

07、什么是缓存雪崩?

答:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,这就造成了缓存雪崩。
下面推荐几个缓存雪崩的解决办法:

  • 1)在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 Key 只允许一个线程查询数据和写缓存,其他线程等待。
  • 2)可以通过缓存 reload 机制,预先去更新缓存,亦即将发生高并发访问前手动触发加载缓存。
  • 3)对不同的 Key,设置不同的过期时间,让缓存失效的时间点尽量均匀。比如我们可以在原有的失效时间基础上增加一个随机值,比如 1 - 5 分钟随机。这样每一个缓存的过期时间的重复率就会大大降低缓存集体失效的概率。
  • 4)设置二级缓存,或者双缓存策略。A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2 缓存失效时间设置为短期,A2 设置为长期。

08、什么是缓存击穿?

答:缓存击穿,是指一个 Key 在不停地支撑着高并发,高并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的高并发就穿破缓存,直接请求数据库。缓存击穿和缓存雪崩的区别在于缓存击穿是针对某一个 Key 缓存而言,缓存雪崩则是针对很多 Key。

对一般的网站而言,很难有某个数据能达到缓存击穿的级别,一般是热门网站的秒杀或爆款商品,才有可能发生这种情况。当然,这时把这种商品设置成永不过期或者过期时间超过抢购时段是一种很好的避免发生缓存击穿的方法,如果这时可以不需要考虑数据一致性的问题的话。

09、什么是缓存预热?

答:缓存预热就是系统上线时,提前将相关的缓存数据直接加载到缓存系统,而不是等到用户请求的时候,才将查询数据缓存。这样用户请求可直接查询事先被预热的缓存数据。缓存预热的方式可以有如下几种:

  • 1)直接写个缓存刷新页面,上线时手工操作。
  • 2)数据量不大,可以在项目启动的时候自动进行加载。
  • 3)定时刷新缓存。

10、如何进行缓存更新?

答:我们知道在缓存中通过 expire 来设置 Key 的过期时间,各缓存服务器一般都有自带的缓存失效策略,这里讲的缓存更新,是指源数据更新之后如何解决缓存数据一致性的问题。个人认为有如下方案:

  • 1)数据实时同步失效或更新。这是一种增量主动型的方案,能保证数据强一致性,在数据库更新之后,主动请求缓存更新。
  • 2)数据异步更新,这是属于增量被动型方案,数据一致性稍弱,数据更新会有所延迟。一般在数据库后,通过异步方式,用多线程方式或消息队列来实现更新。
  • 3)定时任务更新,这是一种全量被动型方案,当然也可以是增量被动型。这种方式保证数据最终一致性,通过定时任务按一定频率调度更新缓存数据一致性最差。

具体采用何种方式,开发者可以根据实际需要来进行取舍。

11、如何进行缓存降级?

答:在网上看到很多地方提到缓存降级,但笔者的理解,很多文章所说的缓存降级,其实都应该是指服务降级。就是说在访问量剧增、服务响应出现问题(如响应延迟或不响应)或非核心服务影响到核心流程的性能的情况下,仍然需要保证核心服务可用,尽管可能一些非主要服务不可用,这时就可以采取服务降级策略。

服务降级的最终目的是保证核心服务可用,即使是有损的。服务降级应当事先确定好降级方案,确定哪些服务是可以降级的,哪些服务是不可降级的。根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心服务的正常运行。

降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。

  • 根据服务方式:可以拒接服务,可以延迟服务,也可以随机提供服务。
  • 根据服务范围:可以暂时禁用某些功能或禁用某些功能模块。

总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽然有损但是总比没有好。

12、如何缓存热点 Key?

答:使用缓存 + 过期时间的策略既可以提高数据读取速度,又能保证数据的定期更新,这种模式基本能够满足绝大部分需求。但是如果当前Key是一个热点Key,并发量非常大,这时就可能产生前面所说的缓存击穿问题。

重建缓存可能是个复杂操作,可能包含有复杂计算 (例如复杂的SQL、多次I/O、多个依赖等)。如果在缓存失效的瞬间,有大量请求进行并发访问,这些访问都会同时访问后端(也就会同时进行重建缓存操作),就会造成后端负载加大,甚至可能造成应用崩溃。

所以缓存热点 Key 为了避免缓存击穿,一是可以设置为永不过期,在不需要考虑数据一致性问题的情况下,个人认为这是最好也最简单的解决方式。如果需要考虑数据一致性问题,需要设置过期时间,那就要考虑如何减少重建缓存的次数,这时采用Redis 的互斥锁是一种解决方式, 这样保证同一时间只能有一个请求执行缓存重建。这样就能有效减少缓存重建次数,但如果重建时间过长,则可能引发其他问题。

13、什么是NoSQL数据库?

答: NoSQL是非关系型数据库的意思,也有的解释成Not Only SQL。

  • 非关系型数据库是对不同于传统关系型数据库的统称。
  • 非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。
  • 由于简单的设计和非常好的性能所以被用于大数据和手机App等。

NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

14、NoSQL和RDBMS有什么区别?

关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。

15、在哪些情况下使用和不使用NoSQL数据库?

在处理非结构化/半结构化的大数据时,在水平方向上进行扩展时,随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。

在考虑数据库的成熟度、支持、 分析和商业智能、管理及专业性等问题时,应优先考虑关系型数据库。

14、非关系型数据库有哪些?

  • Membase:开源项目,NoSQL 家族新的重量级的成员。
  • Mongodb:一个基于分布式文件存储的数据库。
  • Hypertable:是一个开源、高性能、可伸缩的数据库,它采用与 Google 的 Bigtable 相似的模型。
  • HBase:一个分布式的、面向列的开源数据库。
  • Neo4j:一个高性能的 NoSQL 图形数据库,它将结构化数据存储在网络上而不是表中。
  • Redis:基于内存亦可持久化的日志型、Key - Value 型数据库。

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

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

相关文章

Vim操作笔记

注:本篇文章是追加笔记,用于记录自己的常用操作。 将文本中A字符串替换成B字符串 基本语法: :{范围}s/{目标}/{替换}/{标志} 作用范围 分为前行(:s)、全文(:%s)、选区(:start,ends)等。选区可以在Visual模式下选择区域后输入&#xff1a…

Linux之kernel(1)系统基础理论(2)

Linux之Kernel(1)系统基础理论(2) Author: Once Day Date: 2025年2月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

git本地建的分支,删除后内容还能找回

前提&#xff1a; 需要有commit 动作 1、git reflog 命令查看所有分支操作记录&#xff1b; 2、git checkout -b 命令创建一个新的分支&#xff0c;将其指向被删除分支的最后一个提交记录‌&#xff1b; git checkout -b <branch-name> <commit-hash>旨在分享~…

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…

Unity URP后处理在Game窗口不显示

摄像机勾选这个就可以了&#xff1a; 参考&#xff1a;UNITY3D URP与后处理,在game窗口不显示问题_unity urp 半透明材质game看不到-CSDN博客

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

C#02项目——Checked用法

知识点 本项目用到的知识点包括&#xff1a; checked。主要用来处理溢出错误 Try.Prarse。将数字的字符串表示形式转换为其等效的 32 位有符号整数。 返回值指示转换是否成功 public static bool TryParse (string? s, out int result);Try…Catch。用于捕捉异常&#xff0c…

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

Windows 系统 GDAL库 配置到 Qt 上

在地理信息开发中广泛使用的开源库&#xff0c;GDAL(Geospatial Data Abstraction Library&#xff09;)库提供了读取和处理各种地理空间数据格式的能力。 准备阶段 下载 GDAL 库&#xff1a;前往 GDAL 的官方网站&#xff08;https://www.gisinternals.com/&#xff09;下载…

自己动手实现一个简单的Linux AI Agent

大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址&#xff1a; https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…

豆包MarsCode “一键Apply”功能测评:编程效率革新利器

本文 前言功能亮点1. 告别重复操作2. 精准问题解决3. 助力新项目开发4.代码快速切换5.注释快速生成&#xff0c;一键Apply直接粘贴 使用体验总结 本文正在参加豆包MarsCode上新Apply体验活动 前言 在当今快节奏的编程开发领域&#xff0c;效率无疑是开发者们追求的核心目标之一…

SpringBoot中的Javaconfig

为什么要使用Javaconfig&#xff1f; 如果要声明的bean对象&#xff0c;来自于第三方jar包&#xff08;不是自定义的&#xff09;&#xff0c;无法使用Component 及衍生注解来声明bean&#xff0c;因为第三方的jar一般不可写&#xff0c;需要使用注解Configuration和Bean注解来…

ThinkPHP8视图赋值与渲染

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中&#xff0c;使用view函数可以传入视图…

笔记4——列表list

列表list list&#xff1a;一种有序的集合&#xff1b;可以随时添加和删除列表元素&#xff1b;可以包含不同数据类型 使用 【】 定义列表&#xff1b;元素之间用 , 分开 my_list [1,love,0.123,[1,2,3]] print(my_list)len() &#xff1a;获取元素个数&#xff1b;空列表…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴&#xff0c;数据管理系统无非就两个问题&#xff1a;数据怎么存、数据怎么算    现在的信息爆炸时代&#xff0c;一台服务器数据存不下&#xff0c;可以找10台服务器存储&#xff0c;10台存储不下&#xff0c;可以再找100台服务器存储。但是这1…

分布式 IO 模块:港口控制主柜的智能 “助手”

在繁忙的港口&#xff0c;每一个集装箱的装卸、每一艘货轮的停靠与离港&#xff0c;都离不开高效精准的控制系统。港口控制主柜作为整个港口作业的核心枢纽之一&#xff0c;其稳定运行至关重要。而明达技术自主研发推出的MR30分布式 IO 模块可作为从站&#xff0c;与 PLC&#…

Golang GORM系列:GORM 高级查询教程

有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包&#xff08;称为GORM&#xff09;除了标准的CRUD操作之外&#xff0c;还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据&#xff0c;甚至涉…

常见的数据仓库有哪些?

数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…

搜维尔科技在动作捕捉与动画制作、汽车制造与安全测试、机器人与自动化领域的一些案例

动作捕捉与动画制作领域 1.逼真的手部和面部动画制作&#xff1a;动画师施先生利用搜维尔科技代理的Xsens套装、Manus VR手套和Faceware的面部动作捕捉系统&#xff0c;捕捉短片中人物的手部和面部动作&#xff0c;再将数据重新定位到角色骨架上并调整&#xff0c;最终在虚幻引…

HTTP3原理解析和实战应用

http协议原理解析 HTTP1.1改动 keeplive 在http1.0版本中http连接会在每次请求都会发起连接, 并且每次连接在保证安全性都需要建立三次握手, 每次请求后就立即断开连接, 下次请求就还需要重新建立连接.这样就提升了请求的复杂度. keeplive就使得每次建立连接后可以多次请求…