Redis面试题二(数据存储)

news2025/2/24 17:01:40

目录

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.coloradmin.cn/o/1628506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 根据不同角色实现动态底部TabBar导航栏

文章目录 前言最终效果一、实现步骤1.配置page.json中的tabBar属性2.创建自定义tabBar文件3.配置Vuex4.在main.js中引入并挂载store:5.登录页内引入自定义tabbar,根据角色进行登录验证6.在每个导航页中使用自定义的tabbar 前言 在UniApp的开发过程中&am…

Swift - 函数

文章目录 Swift - 函数1. 函数的定义2. 隐式返回(Implicit Return)3. 返回元组:实现多返回值4. 函数的文档注释5. 参数标签(Argument Label)6. 默认参数值(Default Parameter Value)7. 可变参数(Variadic P…

【Java】全套云HIS源码包含EMR、LIS(多医院、卫生机构使用)

云HIS系统简介 SaaS模式Java版云HIS系统源码,在公立二甲医院应用三年,经过多年持续优化和打磨,系统运行稳定、功能齐全,界面布局合理、操作简便。 1、融合B/S版电子病历系统,支持电子病历四级,HIS与电子病…

Redis(七) zset有序集合类型

文章目录 前言命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXZPOPMIN两个阻塞版本的POP命令BZPOPMAX BZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作ZINTERSTOREZUNIONSTORE 命令小结 内部编码使用场景 前言 对于有序集合这个名…

航片水体空洞修补

水体空洞情况如下图所示: 水体空洞修补结果如下图所示: 操作视频教程: MCM智拼图软件V8.5-漏洞空洞修补-水体修补_哔哩哔哩_bilibili

【SDC时序约束】1.主时钟创建

一、时钟 DC工具在进行综合时,需要根据一个时钟进行时序分析。   因此我们需要通过SDC给DC提供一个时钟。   时钟创建是必须的,在创建时钟的同时对时钟进行约束,从而确定整个设计的性能和限制外部时钟。 二、时钟创建 时钟约束通过creat…

详解centos8 搭建使用Tor 创建匿名服务和匿名网站(.onion)

1 Tor运行原理: 请求方需要使用:洋葱浏览器(Tor Browser)或者Google浏览器来对暗,网网站进行访问 响应放需要使用:Tor协议的的Hidden_service 2 好戏来了 搭建步骤: 1.更新yum源 rpm -Uvh h…

React复习笔记

基础语法 创建项目 借助脚手架,新建一个React项目(可以使用vite或者cra,这里使用cra) npx create-react-app 项目名 create-react-app是React脚手架的名称 启动项目 npm start 或者 yarn start src是源文件index.js相当于Vue的main.js文件。整个…

C++—DAY4

在Complex类的基础上&#xff0c;完成^&#xff0c;<<&#xff0c;>>&#xff0c;~运算符的重载 #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){}Complex(int rel,int vir):rel(rel),vir(vir){}void show(){c…

力扣每日一题-总行驶距离-2024.4.25

力扣题目&#xff1a;总行驶距离 题目链接: 2739.总行驶距离 题目描述 代码思路 直接用数学模拟计算即可 代码纯享版 class Solution {public int distanceTraveled(int mainTank, int additionalTank) {int sum 0;while(additionalTank > 0){if(mainTank > 5){mai…

动静态库以及动态链接

文章目录 静态库制作静态库如何使用静态库 动态库动态库的制作动态库的使用动态链接 库是给别人用的&#xff0c;所以库中一定不存在main函数。库一般会有lib前缀和后缀&#xff0c;去掉前缀和后缀才是库名。 静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译…

OpenHarmony实战开发-使用SmartPerf-Host分析应用性能

简介 SmartPerf-Host是一款深入挖掘数据、细粒度展示数据的性能功耗调优工具&#xff0c;可采集CPU调度、频点、进程线程时间片、堆内存、帧率等数据&#xff0c;采集的数据通过泳道图清晰地呈现给开发者&#xff0c;同时通过GUI以可视化的方式进行分析。该工具当前为开发者提…

C#技巧之窗体去鼠标化

简介 在窗体程序中不用鼠标&#xff0c;直接使用键盘完成想要的操作。 实现的方法有两种&#xff0c;一种是使用键盘上的Tab键使控件获得焦点&#xff0c;然后用enter键触发该控件上的事件&#xff08;一般为click事件&#xff09;。另一种是&#xff0c;为控件添加快捷键&am…

优维全新力作:统一采控平台

在本月&#xff0c;优维新一代核心系统「EasyOps」7.0大版本重磅上线&#xff0c;为广大用户带来了“更核心、更智能、更开放、更客制”的产品能力。&#xff08;点击回看&#xff1a;重磅&#xff01;优维科技发布EasyOps7.0大版本&#xff09;在本次版本能力分享上&#xff0…

基于springboot实现中药实验管理系统设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现中药实验管理系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管…

基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于WOA鲸鱼优化的购售电收益与风险评估算法.WOA优化算法是一种基于鲸鱼捕食过程的仿生优化算法&#xff0c;其包括鲸鱼行走觅食、鲸鱼包围以及鲸鱼螺旋捕食三个步骤。在WOA优…

用 Python 创建 Voronoi 图

概述 最常见的空间问题之一是找到距离我们当前位置最近的兴趣点 (POI)。假设有人很快就会耗尽汽油&#xff0c;他/她需要在为时已晚之前找到最近的加油站&#xff0c;解决这个问题的最佳解决方案是什么&#xff1f;当然&#xff0c;驾驶员可以检查地图来找到最近的加油站&…

C++从入门到精通——string类

string类 前言一、为什么学习string类C语言中的字符串示例 二、标准库中的string类string类string类的常用接口说明string类对象的常见构造string类对象的容量操作string的接口测试及使用string类对象的访问及遍历操作下标和方括号遍历范围for遍历迭代器遍历相同的代码&#xf…

6.模板初阶

目录 1.泛型编程 2. 函数模板 2.1 函数模板概念 2.2函数模板格式 2.3 模板的实现 2.4函数模板的原理 2.5 函数模板的实例化 3.类模板 1.泛型编程 我们如何实现一个 交换函数呢&#xff1f; 使用函数重载虽然可以实现&#xff0c;但是有一下几个不好的地方&#xff1a; …

iOS - 多线程-读写安全

文章目录 iOS - 多线程-读写安全1. 多读单写1.1 场景1.2 实现方案1.2.1 pthread_rwlock&#xff1a;读写锁1.2.1.1 示例 1.2.2 dispatch_barrier_async&#xff1a;异步栅栏调用1.2.2.1 示例 iOS - 多线程-读写安全 假设有一个文件&#xff0c;A线程进行读取操作&#xff0c;B…