当前位置: 首页 > news >正文

Redis篇之持久化

一、为什么要进行持久化

        Redis是一个基于内存的键值存储系统,但为了保证数据在服务器重启、故障等情况下不丢失。

二、应该怎么持久化

1.RDB持久化

(1)RDB是什么

        RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

(2)怎么使用RDB

        需要自己手动开启。

        Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

  

(3)RDB的执行原理

        bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。

        页表: 记录虚拟地址与物理地址的映射关系。

        fork采用的是copy-on-write技术: 当主进程执行读操作时,访问共享内存; 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

2.AOF持久化

(1)AOF是什么

        AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

(2)如何使用AOF

        AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:                                                   ​​​​​​​  

        AOF的命令记录的频率也可以通过redis.conf文件来配:

        因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

        Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:                       ​

(3)AOF的工作原理

         AOF持久化记录每一次写操作,并以追加的方式将这些操作命令写入日志文件。当Redis重新启动时,会按照AOF文件中的操作指令顺序逐条执行,从而实现数据恢复。

三、对比两种方法

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中通常会结合使用。

四、面试的时候应该怎么说呢

面试官:redis做为缓存,数据的持久化是怎么做的?

候选人:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF

面试官:这两种持久化方式有什么区别呢?

候选人:RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。

AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据。

面试官:这两种方式,哪种恢复的比较快呢?

候选人:RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令。

​​​​​

相关文章:

  • 云计算、Docker、K8S问题
  • 2024PMP考试新考纲-近年PMP真题练一练和很详细解析(3)
  • netty-websocket扩展协议及token鉴权补充
  • 多线程(一)
  • 【力扣】查找总价格为目标值的两个商品,双指针法
  • Mac 下JDK环境变量配置 及 JDK多版本切换
  • 吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用
  • 2402d,d的静态构造器
  • 多线程基础详解(看到就是赚到)
  • 预测模型:MATLAB线性回归
  • 在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程
  • K8S之Pod常见的状态和重启策略
  • 人工智能之无约束最优化与有约束最优化
  • C# Task的使用
  • 编码技巧——基于RedisTemplate的RedisClient实现、操作Lua脚本
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ES6简单总结(搭配简单的讲解和小案例)
  • IDEA 插件开发入门教程
  • Java教程_软件开发基础
  • Laravel 实践之路: 数据库迁移与数据填充
  • Python_OOP
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 动态规划入门(以爬楼梯为例)
  • 浮现式设计
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 转载:[译] 内容加速黑科技趣谈
  • Java总结 - String - 这篇请使劲喷我
  • ​configparser --- 配置文件解析器​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 达梦数据库知识点
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #微信小程序(布局、渲染层基础知识)
  • $GOPATH/go.mod exists but should not goland
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • ***测试-HTTP方法
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .gitignore文件设置了忽略但不生效
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net core 6.0 升8.0
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net MVC4 上传大文件,并保存表单
  • .net 发送邮件
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET中winform传递参数至Url并获得返回值或文件
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken