Redis面试题二(数据存储)

目录

1.redis 的数据过期策略

1. 惰性删除(Lazy Expiration)

2. 定期删除(Periodic Expiration)

3. 定时删除(Timing-Based Expiration)

实际应用中的组合策略

2.redis 有哪些内存淘汰机制

volatile(设置过期时间的数据集)

allkeys(所有数据集)

no-enviction(驱逐)

3.持久化文件对过期策略的处理?

4.redis 有哪些持久化机制

5.说说 redis 的 RDB

6.说说 redis 的 AOF

7.RDB 和 AOF 该如何选择

8.什么是 redis 的 Pipeline

Pipeline 的工作原理与优势:

Pipeline 的主要优点:

9.原生批命令 (mset, mget) 与 Pipeline 区别?


1.redis 的数据过期策略

1. 惰性删除(Lazy Expiration)

  • 原理:当客户端尝试访问一个键时,Redis 会检查该键是否已过期。如果发现键已过期,Redis 会在返回键值之前立即将其删除,然后返回空值(nil)给客户端,表明该键已不存在或已过期。

  • 特点:惰性删除是一种被动的过期处理方式,仅在访问时才触发删除操作。它对 CPU 资源消耗最小,但如果大量键过期后长时间未被访问,可能会导致无用数据在内存中积累,占用不必要的存储空间。

2. 定期删除(Periodic Expiration)

  • 原理:Redis 会周期性地运行一个名为“过期键删除器”(Expired Keys Collector)的后台进程,它通过一定的算法(如随机采样)从数据库中挑选一部分可能过期的键进行检查,并删除其中已过期的键。这个过程不是严格定时的,而是根据一定的条件和频率进行。

  • 特点:定期删除提供了主动清理过期键的能力,有助于控制内存占用。通过调整删除任务的执行频率和每次扫描的键数量,可以在内存管理与 CPU 利用之间取得平衡。不过,定期删除无法保证过期键会立即被删除,也不能保证在任何时刻所有过期键都已被删除。

3. 定时删除(Timing-Based Expiration)

注:此处存在一些混淆。实际上,Redis 并不直接使用“定时删除”策略,即在设置键的过期时间时就创建一个定时器来精确地在过期时刻删除键。这种做法虽然可以立即释放内存,但会带来较高的 CPU 开销,且在高并发场景下可能引发问题。因此,Redis 通常不采用这种方式。

实际应用中的组合策略

在实际的 Redis 实现中,主要采用的是 惰性删除 与 定期删除 的组合策略。这两种策略互补工作,确保既能及时清理过期数据、控制内存占用,又不至于过度消耗 CPU 资源。

  • 惰性删除 处理那些“恰好”在访问时发现已过期的键,对客户端请求透明,资源消耗小。
  • 定期删除 负责周期性地主动查找并删除过期键,防止大量过期键因长期未被访问而堆积在内存中。

这样的设计使得 Redis 能够在大多数情况下有效地管理过期数据,既保证了服务的响应速度,又合理利用了系统资源。同时,Redis 提供了配置选项,允许管理员根据实际需求调整定期删除任务的执行策略,以适应不同场景下的内存和性能要求。

2.redis 有哪些内存淘汰机制

Redis 作为一个内存数据库,在内存空间不足的时候,为了保证命中率,就会和我们操作系统中的页面置换算法类似,选择一定的数据淘汰策略。

volatile(设置过期时间的数据集)

1)volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。

2)volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。

3)volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。

4)volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。

allkeys(所有数据集)

5)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

6)allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。

7)allkeys-random:从数据集中任意选择数据淘汰

no-enviction(驱逐)

8)no-enviction(驱逐):禁止驱逐数据,这也是默认策略。

3.持久化文件对过期策略的处理?

过期 key 是不会写入 RDB 和 AOF 文件,同时数据恢复时也会做过期验证。

4.redis 有哪些持久化机制

RDB 和 AOF

5.说说 redis 的 RDB

  • 全量快照:RDB 是一种将 Redis 数据库在某一时刻的状态保存为一个紧凑的二进制文件(通常命名为 dump.rdb)的机制。Redis 通过配置规则(如指定的时间间隔、数据变更次数等)触发快照创建过程。在创建快照时,Redis 通常采用 fork 子进程的方式,子进程负责将内存中的数据以序列化格式写入 RDB 文件,而主进程继续处理客户端请求。由于采用了 copy-on-write 机制,这一过程通常对 Redis 的性能影响较小。

  • RDB 支持 同步(save 命令)、后台异步(bgsave)以及自动配置三种方式触发。

  • 优点
    • 文件紧凑,便于备份和快速恢复。
    • 恢复时加载速度快,适合大规模数据的恢复场景。
    • 对于灾难恢复而言,RDB 文件易于传输和存储。
  • 缺点
    • 如果 Redis 宕机且没有及时创建快照,可能会丢失一定时间段内的数据。
    • 创建快照时对 CPU 和内存有一定消耗,特别是在数据量大且变化频繁的情况下。

6.说说 redis 的 AOF

  • 追加式日志:AOF 模式下,Redis 会将所有修改数据库状态的写命令(如 sethsetdel 等)以文本形式追加到一个单独的日志文件中。随着写操作的进行,AOF 文件会不断增长。为了保持文件大小可控和提高恢复效率,Redis 提供了 AOF 重写功能,可以将当前数据库状态以最小数量的操作命令重新写入一个新的 AOF 文件。
  • 同步策略:AOF 提供了多种数据同步至磁盘的策略,如 always(每次写命令都同步)、everysec(默认,每秒同步一次)和 no(由操作系统自行决定何时同步)。
  • 优点
    • 数据安全性高,因为AOF 记录了所有写操作,即使在意外停机后,也能通过回放日志文件几乎精确地恢复数据。
    • 可以通过调整同步策略来在数据安全性与写性能之间做出权衡。
    • 支持 AOF 重写,可以缩小文件体积并去除冗余操作。
  • 缺点
    • AOF 文件通常比 RDB 文件大,恢复速度相对较慢。
    • 在极端情况下(如长时间未同步或文件损坏),可能需要手动修复。

7.RDB 和 AOF 该如何选择

  • Redis 4.0 及以上版本新增:在 Redis 4.0 中引入了混合持久化机制,允许同时开启 RDB 和 AOF。在这种模式下,Redis 重启时首先加载 RDB 快照以快速恢复大部分数据,然后重放 AOF 文件中自 RDB 快照之后的增量写操作。这种组合方式兼顾了 RDB 的快速恢复能力和 AOF 的高数据安全性。
  • 优点
    • 结合了 RDB 和 AOF 的优点,既能够快速恢复大部分数据,又能通过回放 AOF 日志补充恢复期间发生的写操作,降低数据丢失风险。
  • 缺点
    • 需要同时管理 RDB 和 AOF 文件,增加了运维复杂性。
    • 存在一定的资源开销,如额外的磁盘空间和启动时的处理时间。
命令RDBAOF
体积
恢复速度
数据安全性丢数据取决于刷盘策略
轻重

8.什么是 redis 的 Pipeline

Redis Pipeline(管道)是一种客户端批处理技术,它允许客户端在一个网络往返(Round Trip Time, RTT)中发送一组命令到 Redis 服务器,然后一次性接收所有命令的响应。Pipeline 主要目的是减少网络通信的延迟开销,提高 Redis 客户端与服务器之间的交互效率,尤其是在执行大量连续命令时。

Pipeline 的工作原理与优势

  • 批量发送:使用 Pipeline 时,客户端不再等待每个命令的响应,而是将多个命令(可以是任意数量)打包成一个“命令包”,一次性发送给 Redis 服务器。这样,原本需要多次网络往返才能完成的命令序列,现在只需一次网络通信即可发送完毕。

  • 批量响应:服务器接收到包含多条命令的“命令包”后,会按照接收到的顺序依次执行这些命令,并将所有命令的执行结果保存在内部缓冲区。

  • 一次性接收:执行完所有命令后,服务器一次性将所有结果返回给客户端。客户端接收到这个包含所有结果的响应包后,可以逐一解析并处理这些结果。

Pipeline 的主要优点

  • 降低网络延迟:通过减少网络往返次数,显著降低了网络通信的延迟开销,尤其在高延迟或高命令密度的场景下,性能提升尤为明显。
  • 提高吞吐量:由于减少了网络传输和解析响应的时间,使得单位时间内可以处理更多的命令,从而提高了 Redis 的整体吞吐量。
  • 优化资源利用率:对于服务器而言,连续处理一批命令比分散处理单个命令更利于 CPU 缓存的利用,有助于提高服务器端的处理效率。

9.原生批命令 (mset, mget) 与 Pipeline 区别?

1)原生批命令是原子性的,而 pipeline 是非原子操作。

2)原生批命令一命令多个 key, 但 pipeline 支持多命令(存在事务),非原子性。

3)原生批命令是服务端实现,而 pipeline 需要服务端与客户端共同完成。

 

 

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

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

相关文章

Maven解决找不到依赖项

报错如图 方案一&#xff1a;Maven的Setting文件中添加albaba的镜像文件 1.下载maven &#xff1a;Maven – Download Apache Maven 2. 配置镜像 更改成这个&#xff1a; <mirror> <id>alimaven</id> <name>aliyun maven</name> <url&g…

37.WEB渗透测试-信息收集-企业信息收集(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;36.WEB渗透测试-信息收集-企业信息收集&#xff08;3&#xff09;-CSDN博客 关于主域名收…

c#学习入门2

十、运算符 1&#xff09;算术运算符是用于数值类型变量计算的运算符&#xff0c;它返回的结果是数值 1.赋值符号 2.算数运算符 加 减- 乘* 除/ 取余% 3.算数运算符的优先级 4.算术运算符的复合运算 5.算术运算符的自增减 2&#xff09;字符串拼接 1.字符串拼接方式1 注意&…

编写一个函数fun,它的功能是:实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

day01黑马头条小bug合集及解决办法

问题1.初始构造heima-leadnews-user这个模块 触发此bug Command line is too long 解决办法&#xff1a; 问题2&#xff1a;构建网关模块启动时 报数据库错误 Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be confi…

电磁仿真--基本操作-CST-(4)

目录 1. 简介 2. 建模过程 2.1 基本的仿真配置 2.2 构建两个圆环体和旋转轴 2.3 切分圆环体 2.4 衔接内外环 2.5 保留衔接部分 2.6 绘制内螺旋 2.7 绘制外螺旋 2.8 查看完整体 2.9 绘制引脚 2.10 设置端口 2.11 仿真结果 3. 使用Digilent AD2进行测试 3.1 进行…

《HCIP-openEuler实验指导手册》1.2Apache主页面配置

一、配置服务器监听IP及端口 注释主配置文件“监听IP及端口”部分 cd /etc/httpd/conf cp httpd.conf httpd.conf.bak vim httpd.conf可以在普通模式下搜索Listen关键字 :/Listen按n键继续向后搜索 在/etc/httpd/conf.d中新建子配置文件port.conf&#xff1a; touch /etc…

QT——简易计算器(从0开始)

目录 一、题目描述&#xff1a; 二、创建工程&#xff1a; 1. ​编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计&#xff1a; 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…

【介绍下IDM的实用功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

ptyhon画图显示中文

import matplotlib.pyplot as plt import matplotlib# 设置中文字体 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[font.family]sans-serifplt.plot([1, 2, 3, 4]) plt.xlabel(这是x轴) plt.ylabel(这是y轴) plt.title(这是标题) plt.show()用这个代码…

66、二分-搜索旋转排序数组

思路&#xff1a; 不断二分&#xff0c;首先判断左侧有序还是右侧有序&#xff0c;如果左侧有序那么就在左侧寻找&#xff0c;如果右侧有序那就在右侧寻找。假设左侧有序&#xff0c;那就判断目标值在不在左侧&#xff0c;如果在左侧继续左侧二分。如果不在左侧&#xff0c;那么…

使用aqua data studio进行mysql、oracle、syabse等等debug调试

1、在aqua data studio界面 右击左边空白位置&#xff0c;选择”注册服务器“&#xff0c;弹出框如下&#xff1a; 2、在”一般“里选择使用的数据库&#xff0c;如sybase、mysql, 3、登录成功后&#xff0c;会显示数据库&#xff0c;点击要debug的存储过程

WIFI信号状态信息 CSI 特征提取篇之活动片段提取上(五)

在之前的数据处理环节中&#xff0c;用CSI Tool收集到的原始数据信号&#xff0c;经历了数据解析、降噪、插值的处理步骤&#xff0c;变成了干净、完整的信号片段&#xff0c;这是后续做更进一步分析的基础。 在开始阅读本篇博客前&#xff0c;需要说明两个重要的点&#xff1…

基于SpringBoot + Vue实现的家政服务管理系统设计与实现+毕业论文+答辩PPT+指导搭建视频(包运行成功)

目录 项目介绍 论文展示 资源获取 项目介绍 家政服务管理平台是一个管理信息系统&#xff0c;为了宣传的需要&#xff0c;为了给用户提供方便快捷的服务&#xff0c;从而设计了家政服务管理平台。管理员可以通过这个系统把家政服务信息发布出去&#xff0c;可以方便用户快…

RK3568平台开发系列讲解(Linux系统篇)芯片手册的使用:GPIO的寄存器说明

🚀返回专栏总目录 文章目录 一、查找复用寄存器二、查找方向寄存器三、查找数据寄存器沉淀、分享、成长,让自己和他人都能有所收获!😄 📢寄存器GPIO 进行配置, 一般情况下需要对 GPIO 的复用寄存器, 方向寄存器, 数据寄存器进行配置。 GPIO0_B0 配置为例: 一、查…

《十一》Qt各种对话框之QInputDialog

QInputDialog QInputDialog 用于方便快捷地获取一个用户输入数据&#xff0c;支持整数 int、浮点数 double、文本 QString 三种数据。按照 QInputDialog 内部的输入控件&#xff0c;又可以分为整数输入控件 QSpinBox、浮点数输入控件 QDoubleSpinBox、单行文本输入控件 QLineE…

C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

目录 一、容器适配器 1.1容器适配器概念的介绍 1.2stack和queue的底层结构 1.3deque容器的介绍 1.3.1deque的缺陷及为何选择他作为stack和queue的底层默认实现 二、stack的介绍和使用 2.1stack的介绍 2.2stack的使用 2.3stack的模拟实现 三、queue的介绍和使用 …

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

Qt:学习笔记一

一、工程文件介绍 1.1 main.cpp #include "widget.h" #include <QApplication> // 包含一个应用程序类的头文件 //argc&#xff1a;命令行变量的数量&#xff1b;argv&#xff1a;命令行变量的数组 int main(int argc, char *argv[]) {//a应用程序对象&…

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式&#xff08;Behavioral Pattern&#xff09;是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并…