Redis面试——日志

一、RDB(Redis DataBase)

  1. RDB 全程是 Redis DataBase,它是一种将 Redis 在某一时刻内存中的数据以快照形式保存到磁盘的机制 ,相当于给执行save/bgsave命令时刻的内存数据库数据拍了一张快照
  2. 我们如果通过save命令来执行快照,由于 Redis 是单线程模型,save命令会阻塞主线程,因为快照生成的过程比执行普通指令耗时更长,在此期间 Redis 无法处理客户端请求。而bgsave命令会 fork 出一个子进程,由子进程在后台执行备份工作,主线程可以继续处理客户端请求,不会造成阻塞。因此在实际应用中,推荐使用bgsave来生成 RDB 快照。需要注意的是,fork 子进程时会有短暂的阻塞,且会占用一定内存(基于写时复制技术,父子进程共享内存,只有在数据发生修改时才会为子进程分配独立内存)
  3. RDB 的优点是:
    1. 第一个是 RDB 生成的快照文件经过了二进制压缩,体积相对较小。虽然 Redis 是内存数据库,但数据量可能较大,不过经过压缩处理后的 RDB 文件依然便于存储和传输
    2. 第二个是它恢复数据的速度很快,因为在数据恢复时,直接将 RDB 文件中的数据一次性加载到内存即可,不需要像 AOF 那样逐条重放日志。所以 RDB 适合做数据备份和灾难恢复
  4. RDB 的缺点是:
    1. 第一个,两次快照之间的数据可能会丢失。例如第一次快照后隔了很长时间才进行下一次快照,那么万一数据库宕机,就会丢失这两次快照间隔期间的数据
    2. 第二个,如果频繁执行快照,即使使用bgsave开启后台线程进行工作,fork 子进程以及子进程进行数据持久化操作都会占用 CPU、内存等系统资源,对服务器性能产生一定影响

二、AOF(Append Only File)

  1. Redis 会在硬盘上创建一个 AOF(Append Only File)文件,该文件用于记录服务器执行的所有写操作命令
  2. Redis 提供了三种 AOF 写策略:
    1. always:每次执行写操作后,Redis 主线程会立即将写操作同步到硬盘上的 AOF 文件中。这种策略能保证数据的最高安全性,因为一旦写操作执行成功,就会被持久化到磁盘,但会对性能产生较大影响,因为每次写操作都涉及磁盘 I/O
    2. everysec:Redis 会使用一个后台线程(更准确地说是子线程)每秒将这一秒内发生的写操作追加到 AOF 文件中。这种策略在性能和数据安全性之间做了平衡,即使服务器发生故障,最多只会丢失一秒内的数据
    3. no:将数据写入 AOF 文件的操作完全交给操作系统决定。Redis 只负责将写操作追加到 AOF 缓冲区,由操作系统决定何时将缓冲区的数据刷新到磁盘。这种策略性能最高,但数据安全性最低,因为在操作系统未将数据刷新到磁盘时服务器宕机,可能会丢失较多数据
  3. AOF 的缺点在于:
    1. 由于 AOF 文件持续记录写操作,随着时间推移和写操作的增加,AOF 文件会变得越来越大,这会占用大量的磁盘空间
    2. 在恢复数据时,相较于 RDB 方式,AOF 恢复速度较慢。因为 Redis 单线程需要将 AOF 文件中的所有写操作命令依次重新执行一遍,而 RDB 是直接将数据加载到内存
  4. 此外,Redis 为了解决 AOF 文件过大的问题,提供了 AOF 重写机制,它可以在不改变数据库状态的前提下,将 AOF 文件中冗余的命令合并,从而减小 AOF 文件的体积

三、RDB vs AOF如何选择?

  1. 如果需要快速恢复数据,采用 RDB 是比较合适的选择。RDB 是将 Redis 某一时刻的内存数据以快照形式保存到磁盘,恢复数据时直接将 RDB 文件加载到内存,无需像 AOF 那样重新执行大量的写命令,因此恢复速度较快,能在短时间内让 Redis 服务恢复到之前的状态
  2. 如果需要保证数据的绝对安全,AOF(always)策略是一个好的选择。使用 always 策略时,每次写操作都会立即同步到磁盘上的 AOF 文件中,这样即使 Redis 服务器发生故障或意外宕机,也不会丢失任何已执行的写操作数据,最大程度地保证了数据的完整性和安全性。不过,这种策略会对 Redis 的性能产生较大影响,因为频繁的磁盘 I/O 操作会成为性能瓶颈
  3. 在高并发场景下,选择 RDB + AOF 结合的策略通常是比较明智的。RDB 可以定期生成数据快照,用于全量数据备份和在需要时快速恢复数据,减轻数据恢复的时间成本;AOF 采用 everysec 策略(而不是 always 策略,因为 always 策略在高并发下性能损耗过大),每秒将写操作同步到 AOF 文件,在保证数据安全性(最多丢失 1 秒的数据)的同时,也不会对性能造成太大的影响。两者结合,既能满足高并发场景下对性能的要求,又能在一定程度上保证数据的安全性和可恢复性

四、总结与持久化配置建议

  1. 在通用场景下,采用RDB(每天定时执行) + AOF(everysec)结合的策略是较为常见且合理的选择
  2. 如果对数据安全性要求极高,可以采用 AOF(always)策略

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

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

相关文章

【Android】常用参数实践 用户界面UI 布局文件XML

本文将系统总结 Android XML 布局的通用参数和常用布局类型的专属规则 一、通用布局参数 这些参数适用于所有 View 和 ViewGroup,是布局设计的基石。 1. 尺寸控制 android:layout_width 与 android:layout_height 定义视图的宽度和高度,可选值&#xf…

解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题

在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…

Linux: 线程同步

目录 一 前言 二 线程饥饿 三 线程同步 四 条件变量 1. cond ( condition) 2. pthread_cond_wait() : 3. pthread_cond_signal() 五 条件变量的使用 一 前言 在上篇文章Linux : 多线程互斥-CSDN博客我们讲解了线程互斥的概念&#xff…

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…

[数据结构]哈希表

目录 1、哈希表 1.1、概念 1.2、冲突 2、哈希函数设计 3、负载因子调节 4、闭散列 5、开散列/哈希桶(重点掌握) 6、实现哈希桶 6.1、put方法 6.2、HashMap的扩容机制 6.3、get方法 7、HashMap 8、HashSet 8.1、哈希表性能分析 9、hashcod…

VS-Code创建Vue3项目

1 创建工程文件 创建一个做工程项目的文件夹 如:h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称:自已输入 回车 可以按键盘 a (全选) 回车: Playwright…

linux休眠唤醒流程

1、框架 2、休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态,给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr, …

Mysql--基础知识点--93--两阶段提交

1 两阶段提交 以update语句的具体执行过程为例: 具体更新一条记录 UPDATE t_user SET name ‘xiaolin’ WHERE id 1;的流程如下: 1.执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id 1 这一行记录&#…

Windows 环境下 Apache 配置 WebSocket 支持

目录 前言1. 基本知识2. 实战前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 原先写过apache的http配置:Apache httpd-vhosts.conf 配置详解(附Demo) 1. 基本知识 🔁 WebSocket 是 HTTP 的升级协议 客户…

UMAEA论文阅读

Preliminaries MMKG为一个五元组G{E, R, A, V, T},其中E、R、A和V分别表示实体集、关系集、属性集和图像集。 T⊆ERE是关系三元组集。 给定两个MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}, MMEA旨在识别每个实体对(e1…

AIGC-十款知识付费类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

Qt界面卡住变慢的解决方法

本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战!| 附源码

【LangChain4j快速入门】5分钟用Java玩转GPT-4o-mini,Spring Boot整合实战! 前言:当Java遇上大模型 在AI浪潮席卷全球的今天,Java开发者如何快速拥抱大语言模型?LangChain4j作为专为Java打造的AI开发框架&#xff0c…

Vue 3 reactive 和 ref 区别及 失去响应性问题

在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等&#xff09…

第一节:Vben Admin 最新 v5.0初体验

系列文章目录 基础篇 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权…

Nginx部署spa单页面的小bug

没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…

面试算法高频08-动态规划-01

动态规划 递归知识要点 递归代码模板:提供递归代码的标准形式public void recur(int level, int param) ,包含终止条件(if (level> MAX_LEVEL))、当前层逻辑处理(process(level, param))、向下一层递归…

若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)

若依框架前后端分离版部署全流程详解(本地服务器高级配置) 若依(RuoYi)作为一款基于SpringBoot和Vue的权限管理系统,凭借其模块化设计和开箱即用的特性广受开发者欢迎。本文将从本地部署、服务器部署、高级配置三个维…

医疗设备预测性维护合规架构:从法规遵循到技术实现的深度解析

在医疗行业数字化转型加速推进的当下,医疗设备预测性维护已成为提升设备可用性、保障医疗安全的核心技术。然而,该技术的有效落地必须建立在严格的合规框架之上。医疗设备直接关乎患者生命健康,其维护过程涉及医疗法规、数据安全、质量管控等…