【大厂秘籍】 - Redis持久化篇

创作不易,你的关注分享就是博主更新的最大动力, 每周持续更新

微信搜索【 企鹅君】关注还能领取学习资料喔,第一时间阅读(比博客早两到三篇)

求关注❤️ 求点赞❤️ 求分享❤️ 对博主真的非常重要

企鹅君原创|GitHub开源项目github.com/JavaDance 欢迎Star和完善

面试开始

激动的心,颤抖的手, 你打开了面试官发过来的远程面试链接

对面是一位身穿格子衬衫的有点中年发福的男子,

看着屏幕上面试官反光的头顶,一寸亮,一寸强!啧啧,你瞬间就感受面试官的实力恐怖如斯~~

但是你也不慌,因为你早已看了多遍《大厂秘籍》,再见面试官都是小场面

面试官从你的项目聊到了Java知识、数据库, 然后就到了面试基本必问的Redis

你心想这不踢到钢板了吗, 公司同事都尊称你是「Redis小王子」

但你还是忍住了心中的沸腾,面色平静、假装着小白等着面试官提问

面试官: 小伙汁, Redis有几种持久化选项,你知道吗

Redis 是一种内存数据库,读写效率快。但是一旦进程退出,Redis 内存数据就会丢失。为了解决这个问题
Redis 提供了4种持久化选项,将数据写入保存到本地磁盘

  1. RDB (Redis DataBase, Redis 数据库)默认的持久化方式

  2. AOF(Append Only File, 仅追加文件)

  3. RDB + AOF(混合持久化)

  4. No persistence(无持久化), 一些简单的业务场景也可以选择关闭持久化RDB

那你讲讲RDB和AOF

RDB

RDB是Redis默认的持久化方式(Redis DataBase, Redis 数据库)。(Redis DataBase, Redis 数据库)按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。
RDB 触发机制分为使用指令手动触发和配置自动触发。
手动触发方式:
● save 命令 ,该指令会阻塞当前 Redis 服务器,执行 save 指令期间,Redis 不能处理其他命令,直到 RDB 过程完成为止。
● bgsave 命令,执行该命令时,Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。,此时 Redis 仍然可以相应客户端请求。
配置自动触发方式 :
redis.conf 默认配置

save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB

AOF

AOF持久化(Append Only File, 仅追加文件),是将Redis执行的每次写命令记录到单独的日志文件中,然后可以在服务器重启时重新执行这些操作,从而恢复数据。

aof具体实现

AOF 持久化功能的实现可以分为5步:

  1. 命令追加(append):所有的写命令会追加到 AOF 缓冲中。
  2. 文件写入(write):将 AOF 缓冲区的数据写入到 AOF 文件中。这一步需要调用write函数(系统调用), 此时并没有同步到磁盘。
  3. 文件同步(fsync):AOF 缓冲区根据对应的持久化方式( fsync 策略)向硬盘做同步操作。这一步需要调用 fsync 函数(系统调用), fsync 针对单个文件操作,对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。
  4. 文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  5. 重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。
    AOF写入内容
    当 AOF 持久化功能处于打开状态时,Redis 在执行完一个写命令之后,被执行的写命令追加到 Redis 服务端维护的 AOF 缓冲区末尾。
    比如说 SET mykey myvalue 这条命令就以如下格式记录到 AOF 缓冲中。
"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"

AOF之所以直接采用文本协议格式,是因为所有写入命令都要进行追加操作,直接采用协议格式,避免了二次处理开销。

小伙汁不错嘛,答得这么流畅,看来是没少看《大厂秘籍》,接着就问到:AOF 持久化方式有哪些?

AOF持久化方式有三种,可以在Redis配置文件中设置 appendfsync 选项的值。

  1. append fsync always: Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件,并且同步 AOF 文件,所以 always 的效率是 appendfsync 选项三个值当中最差的一个,但从安全性来说,也是最安全的。当发生故障停机时,AOF 持久化也只会丢失一个事件循环中所产生的命令数据。
  2. appendfsync everysec:Redis 在每个事件循环都要将 AOF 缓冲区中的所有内容写入到 AOF 文件中,并且每隔一秒就要在子线程中对 AOF 文件进行一次同步。从效率上看,该模式足够快。当发生故障停机时,只会丢失一秒钟的命令数据。
  3. appendfsync no:永远不会fsync,只需将您的数据交给操作系统即可。更快但安全性较低的方法。通常 Linux 会使用此配置每 30 秒刷新一次数据

appendfsync的三个值代表着三种不同的调用 fsync的策略。
建议(和默认)的策略是``appendfsync everysec。它既快速又相对安全。always`策略在实践中非常慢。
AOF 重写

AOF重写有了解过吗

  1. 因为 AOF 持久化是通过保存被执行的写命令来记录 Redis 状态的,所以随着 Redis 长时间运行,AOF 文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的 AOF 文件很可能对 Redis 甚至宿主计算机造成影响。
    为了解决 AOF 文件体积膨胀的问题,Redis 提供了 AOF 文件重写( rewrite) 功能。通过该功能,Redis 可以创建一个新的 AOF 文件来替代现有的 AOF 文件。新旧两个 AOF 文件所保存的 Redis 状态相同,但是新的 AOF 文件不会包含任何浪费空间的荣誉命令,所以新 AOF 文件的体积通常比旧 AOF 文件的体积要小得很多。

aof重写

如上图所示,重写前要记录名为list的键的状态,AOF 文件要保存五条命令,而重写后,则只需要保存一条命令。

那到底应该怎么选择Redis持久化呢

● 如果可以忍受灾难发生时几分钟的数据丢失,建议单独使用 RDB。
● 不建议单独使用 AOF,因为时不时地创建一个 RDB 快照可以进行数据库备份、可以更快的重启恢复数据
● 如果对数据要求安全性比较高的话(不能丢失),建议使用 RDB 和 AOF 混合持久化。


(答得这么好,都有点佩服自己了, 读者朋友们到这赶紧点点赞)

面试结束

小伙汁你针不戳,给你发Offer了,能不能早点来公司上班呀

你心想自己手里还有几个其他大厂的Offer呢,还得问下网友考虑选哪个好呢

你当然没把心里话说出来,假装镇定回复合适的话,争取早点来公司。

好的。面试官 心想这小伙汁有点东西,必须把他招进公司,赶紧联系hr给他工资加满。

你感叹《大厂秘籍》果然有用,再也不用担心没有Offer了

赶紧让你的小伙伴也分享点赞收藏!!!

总结

**技术面试其实并不难,但是也没有什么捷径,(当然博主希望《大厂秘籍》可以帮助读者少走弯路)平时多看多总结。在面试的时候,可以试着通过自己的项目引导面试官向你熟悉的领域提问,比如你的简历项目里写到了使用Redis解决了XX问题,这时候面试官基本都会问你更细节的东西,这样在你提前准备下逻辑清晰, 有理有据的讲出如何解决问题会在面试官心里加不少分, 那一个个Offer还不到手就来!_! **

参考

● Redis persistence - Redis 官方文档:https://redis.io/docs/management/persistence/
● Redis AOF 持久化详解 - 程序员历小冰:http://remcarpediem.net/article/376c55d8/

创作不易,你的关注分享就是博主更新的最大动力, 每周持续更新

微信搜索【 企鹅君 】第一时间阅读(比博客早一到两篇), 关注还能领取资料

求关注❤️ 求点赞❤️ 求分享❤️ 对博主真的非常重要

企鹅君原创|GitHub开源项目github.com/JavaDance 欢迎Star和完善

公众号

本文由mdnice多平台发布

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

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

相关文章

UL2034详细介绍UL 安全单站和多站一氧化碳报警器标准

在介绍相关标准之前先介绍一下UL认证和UL测试报告的区别,检测认证行业6年老司机 UL认证是自愿性的认证,需要检测产品和审核工厂,每个季度审核一次,费用高、时间久,而且审厂非常的严格。 UL测试报告是根据产品选用相应…

Linux中安装字体

问题说明 wps 安装后打开文件部分字体出现乱码,原因主要是linux中缺少windows中的相关字体,只要从windows电脑中的字体拷贝到linux系统中并安装就能解决问题 对ubuntu 和manjora有效。 安装字体 字体下载地址可参考附录 在 Linux 中,一次…

传奇手游详细图文架设教程

开始架设 1. 架设条件 传世手游架设需要准备: linux 服务器,建议 CentOs 7.6 版本,游戏源码, 游戏运行大约占 2.5G 左右内存。 2. 安装宝塔及环境 宝塔是一个服务器运维管理软件,安装命令: yum inst…

掌握 Vue 响应式系统,让数据驱动视图(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Django框架完成读者浏览书籍,图书详情页,借阅管理

前情回顾: 使用Django框架实现简单的图书借阅系统——完成图书信息管理 文章目录 1.完成展示图书信息功能1.1django 静态资源管理问题1.2编写图书展示模板HTML 2.完成图书详情页功能2.1从后端获取图书详情信息2.2详情页面展示图书数据 3.完成借阅管理功能3.1管理员…

QT上位机开发(文本编辑器的界面开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 文本编辑器是编程开发中经常使用到的一个软件,比如说notepad就是其中一种。这里说编写一个文本编辑器,并不是说真的要写一个…

linux 内存

linux内存分类 按用途分 stack heap(brk,sbrk , mmap), 文件映射, bss, data , text, 还有page cache, slab(kmalloc连续), vmalloc等内核深处的。 属性 进程OOM 对于进程来说,堆泄漏在死亡时是没问题 但…

【Java SE语法篇】7.面向对象——类和对象

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 文章目录 1. 面向对象程序设计概述1.1 类1.2 对象1.3 类之间的…

UE5 实现RPG游戏操作控制

在UE5以后,epic抛弃了之前的那一套操作输入系统,使用了一套新的增强输入作为替代,目的主要是解决经常切换操作时的问题(操作人物上车以后,可以直接切换成操作汽车的一套输入)接下来,将实现如何使…

用React给XXL-JOB开发一个新皮肤(三):实现登录页和Layout骨架

目录 一. 简述二. 接口服务调整 2.1. 登录接口2.2. 登出接口2.3. 修改密码接口2.4. 修改配置文件 三. 前端HTTP 请求四. 登录页面 4.1. 搭建登录页面4.2. 对接登录接口 五. Layout 骨架 5.1. 搭建骨架5.2. Header5.3. 修改密码5.4. 退出登录 六. 其他 一. 简述 上一篇文章我…

Android代码混淆

Android之代码混淆 代码混淆的作用设置混淆1. 在模块目录下的 build.gradle 文件中配置以下代码2. 在 proguard-rules.pro 文件中添加混淆规则 通用混淆规则常用匹配符常用命令注意事项如何查看是否已混淆 代码混淆的作用 1.令 APK 难以被逆向工程,即很大程度上增加…

Nightingale 夜莺监控系统 - 监控篇(2)

Author:rab 官方文档:https://flashcat.cloud/docs/content/flashcat-monitor/categraf/3-configuration/ 目录 前言一、Categraf 配置文件二、Input 插件配置文件2.1 插件说明2.2 通用配置2.2.1 配置采集频率 interval2.2.2 配置采集实例 instances2.2…

Spring Boot - Application Events 的发布顺序_ContextRefreshedListener

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

AI语音识别模块--whisper模块

1.下载 ffmpeg,挑一个自己电脑系统的版本,下载,如我win64: 地址: Releases BtbN/FFmpeg-Builds GitHub 下载压缩包zip,到本地 解压安装,其实无需安装,只需把对应的目录下的bin&…

2024年第1周,第一期技术动态

大家好,才是真的好。 今天周五,我们继续介绍与Domino相关产品新闻,以及互联网或其他IT行业动态等。 一、Notes/Domino V9和V10技术支持结束和假消息 今年2024年6月1号,HCL将结束IBM Notes/Domino 9.0.x和10.0.x产品的技术支持声…

制作 CentOS Stream9 的U盘系统启动盘

一、简述 注:请勿用于商用,如有版权纠纷,于博主无任何关系。(仅用于学习研究使用) 由于CentOs Linux 7和CentOs Stream8终止日期是2024年,需要将系统升级到最新版本的CentOs Stream9,下面是刻录系统盘的操…

用js做个转盘

样式 <style>.wheel {position: relative;width: 400px;height: 400px;border: 1px solid black;border-radius: 50%;overflow: hidden;margin: auto;}.slice {position: absolute;left: 0;top: 0;width: 0;height: 0;border: 200px solid red;/* border-width: 100px 10…

Linux/SwagShop

Enumeration nmap 仍然一样&#xff0c;先使用nmap探索目标开放端口情况 看到开启了22端口和80端口&#xff0c;还是一样的&#xff0c;先从80端口开始探索&#xff0c;从nmap给出的结果&#xff0c;我们可以看到有一个域名&#xff0c;因此在/etc/hosts中添加域名到IP的映射…

ODBC 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配

常规办法就是64位或32位匹配&#xff0c;如果解决不了&#xff0c;往下看。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓解决方案↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 解压AccessDatabaseEngine_X64.exe&#xf…

【C++】C++11中的常见语法(下)

C11 一、可变参数模板1. 递归函数方式展开参数包2. 逗号表达式展开参数包3. STL容器中的 empalce 相关接口函数 二、lambda 表达式1. C98 中的一个例子2. 使用 lambda 表达式3. lambda 表达式语法&#xff08;1&#xff09;lambda 表达式各部分说明&#xff08;2&#xff09;捕…