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

Redis的持久化机制

Redis当中的持久化机制:Redis当中提供了持久化机制,它会把内存当中的数据备份在磁盘当中!磁盘当中的文件当你出现断电、宕机之后,在你重启Redis时,它会把磁盘当中的文件再加载到内存当中,从而保证你的数据可以不丢失!

持久化机制可以保证即使Redis进程在写入数据时崩溃,数据也不会丢失~!

Redis的持久化机制有两种方案:RDB和AOF!

持久化机制 - RDB持久化

  • RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照,是Redis默认的持久化方式。
  • 简单来说就是把/将Redis内存当中的所有数据以二进制形式都记录/保存到磁盘当中,当Redis实例发生故障重启后,此时会从磁盘读取快照文件并加载到内存当中,从而来恢复数据。
  • Disk:磁盘   DB  loaded  from  disk
  • RDB备份文件:dump.rdb => 保存的都是二进制形式的数据
  • 快照文件称为RDB文件,保存了最后一次生成快照时Redis当中的所有数据,默认是保存在当前运行目录!

RDB持久化的执行时机

RDB持久化在四种情况下会执行:被动操作(一二三) + 主动操作(四)

  • 一和二都是手动触发快照操作,让Redis去做一个备份! 
  1. 手动调用执行save命令, 可以立即执行一次RDB:DB saved on disk:保存在磁盘上,save指令是由Redis的主进程来执行RDB备份操作,由于Redis的工作线程是单线程,如果执行save指令则会阻塞其他所有命令的执行,因此不建议使用!只有在数据迁移时可能用到Redis为了规避这个问题,又给我们提供了另外一个指令:bgsave!
  2. 手动调用执行bgsave命令,异步执行RDB:bg指的是background,后台运行,bgsave指令会开启独立的子进程来执行RDB备份操作,从而避免主进程受到影响,主进程可以持续处理用户请求,不受影响。
  3. Redis停机(关闭Redis服务器)时会执行一次save命令,执行RDB备份操作,实现RDB持久化:Saving the final RDB snapshot before exiting. 在退出之前保存最后的RDB快照。但是注意:如果突然断电则不执行RDB备份操作,主动关闭Redis服务器才会执行~!

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

  • RDB:把内存当中的数据直接备份到RDB文件当中~! 
# 900秒内,如果至少有1个key被修改,则执行bgsave命令来指定RDB备份操作 如果是save "" 则表示禁用RDB
save 900 1  如果900s内有一个Key发生变化被修改,就触发一次RDB
save 300 10 如果300s内有十个Key发生变化,就触发一次RDB
save 60 10000 如果60s内有一万个Key发生变化(代表60s内至少执行10000次修改责编触发RDB),就触发一次RDB

RDB的其它配置也可以在redis,conf文件中设置:

# 是否对RDB备份文件做压缩处理,降低RDB文件的体积
# 建议不开启,压缩也会消耗cpu,影响Redis的性能磁盘的话不值钱
rdbcompression yes# RDB文件名称
dbfilename dump.rdb  # RDB文件保存的路径目录   ./表示当前目录
dir ./ 

RDB的缺点

  • 如果发生断电,则RDB会存在丢失数据的风险:上一次触发了RDB,下一次还没来得及触发突然发生断电了,两次RDB之间写入数据就有丢失的风险;
  • RDB它是将内存当中的数据以及快照直接保存在磁盘当中, 写RDB文件比较耗时,耗费性能~!前提是你的内存当中存储的数据量比较大!

持久化机制 - AOF持久化

  • AOF全称为Append-Only File(追加文件)。
  • AOF备份文件:appendonly.aof  
  • AOF持久化是将Redis服务器处理的每一个写命令/写操作(set命令 => 只记录影响数据变化的指令 => 增删改的)都会追加记录在AOF文件的末尾,以文本格式记录了Redis服务器收到的每个写操作的命令,可以看做是命令日志文件。 
  • 当Redis需要恢复数据时,只需重新执行AOF文件中的命令即可。
  • AOF持久化可以提供更高的数据安全性,因为在每次写操作后都会追加到AOF文件中,避免了数据丢失的风险。

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

# 是否开启AOF持久化功能,默认是no,是关闭的,如果需要开启AOF持久化,则需要将no改为yes
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

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

# 表示每执行一次写命令,立即记录到AOF文件(写一次,保存一次)
appendfsync always 
# sec是second-秒的简写,写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
三种策略对比:  

AOF文件重写

  • 因为是记录命令,AOF文件会比RDB文件大的多而且AOF会记录对同一个Key的多次写操作,但是只有最后一次写操作才有意义。 
  • 因此Redis给我们提供了一条命令,通过执行bgrewriteaof命令 => 对AOF日志进行重写,可以让AOF文件执行重写功能,AOF文件重写是Redis中一种优化AOF持久化机制的操作,它重新创建一个更小的AOF文件来替代原有的AOF文件,从而达到减轻磁盘空间占用和提高读取性能的目的,通过消除 / 删除已过期或已删除的数据的命令 => 只会记录该Key的最后一次修改,用最少的命令达到相同效果,从而在一定程度上去降低AOF日志文件的体积。
  • AOF文件重写的过程并不是简单的对原有的AOF文件进行压缩或者整理,而是通过读取内存中的数据来重建一个新的AOF文件,它会遍历Redis当前内存中的数据并将其以命令的形式写入到新的AOF文件中,整个过程不受原有AOF文件的影响,因此可以消除原AOF文件中已过期或已删除的数据。
AOF文件重写的触发方式有两种:
  1. 手动触发:通过发送bgwriteaof命令给Redis服务器,从而来手动触发AOF文件重写。
  2. 自动触发:通过设置redis.conf配置文件中的auto-aof-write-percentage和auto-write-min-size参数来配置自动触发AOF文件重写的条件。Redis也会在触发阈值时自动去重写AOF文件,当AOF文件的大小比上次文件增长超过指定的百分比 ,或者AOF文件的体积大小超过指定的最小体积时,Redis会自动触发AOF文件重写。
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb 

需要注意的是:AOF文件重写是一个耗时且消耗CPU资源的操作,可能会对Redis服务器产生负载,因此在生成环境中需要谨慎使用。

RDB和AOF对比

维度RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的写命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如aof高,因为数据完整性更高
系统资源占用高,大量cpu和内存消耗低,主要是磁盘io资源,但aof重写时会占用大量cpu和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高常见

RDB和AOF各有自己的优缺点,可以选择同时启用RDB和AOF持久化,这样在Redis重启时可以使用RDB文件加载数据,通过重放AOF文件中的命令来实现数据的完整性和一致性~!

 

相关文章:

  • 如何在苹果Mac系统设置中查看Wi-Fi密码?
  • 阿里云二级域名绑定与宝塔Nginx反向代理配置
  • 前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
  • 竞赛选题 深度学习实现语义分割算法系统 - 机器视觉
  • Ubuntu:解决PyCharm中不能输入中文或者输入一个中文解决方法
  • 【Python语言速回顾】——数据可视化基础
  • GZ035 5G组网与运维赛题第8套
  • 如何发布自己的golang库
  • 元素的水平居中和垂直几种方案
  • 新技术前沿-2023-应用GPT提问模板写技术文章
  • 什么是Web 3.0?
  • 无声的世界,精神科用药并结合临床的一些分析及笔记(十)
  • 虹科示波器 | 汽车免拆检修 | 2010款江铃陆风X8车发动机怠速抖动、加速无力
  • S32K324 UDS Bootloader开发-下位机篇-Bootload软件(1)
  • 【Spark】What is the difference between Input and Shuffle Read
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 07.Android之多媒体问题
  • 10个最佳ES6特性 ES7与ES8的特性
  • CSS相对定位
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Javascript Math对象和Date对象常用方法详解
  • javascript 总结(常用工具类的封装)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Node 版本管理
  • npx命令介绍
  • Odoo domain写法及运用
  • Redis的resp协议
  • Theano - 导数
  • Unix命令
  • 构造函数(constructor)与原型链(prototype)关系
  • 理清楚Vue的结构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 小试R空间处理新库sf
  • HanLP分词命名实体提取详解
  • ​2021半年盘点,不想你错过的重磅新书
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $.each()与$(selector).each()
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二十四)Flask之flask-session组件
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (剑指Offer)面试题34:丑数
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)SpringBoot3---尚硅谷总结
  • (转)LINQ之路
  • ***详解账号泄露:全球约1亿用户已泄露
  • .class文件转换.java_从一个class文件深入理解Java字节码结构