Redis持久化——内存快照(RDB)
最新:Redis持久化——如何选择合适的持久化方式
最新:Redis持久化——AOF日志
最新:Redis持久化——内存快照(RDB)
一文回顾Redis五大对象(数据类型)
Redis对象——有序集合(ZSet)
Redis对象——集合(Set)
Redis对象——列表(List)
Redis对象——哈希(Hash)
Redis数据结构——quicklist
Redis对象——字符串
Redis对象——Redis对象系统简介
Redis数据结构——压缩列表
Redis数据结构——整数集合
Redis数据结构——跳跃表
Redis数据结构——字典
Redis数据结构——链表
Redis数据结构——简单动态字符串SDS
我们都知道Redis是内存数据库,它将自己的数据存储的内存中。这样一旦服务器进程退出(断电、重启等原因),那么数据将会丢失。为了解决这个问题,Redis提供两种持久化的方式来将数据持久化到硬盘上,即内存快照(RDB)与AOF日志。
1 什么是内存快照
所谓内存快照,顾名思义就是给内存拍个照,在某个时刻把内存中的数据记录下来,以文件的形式保存到硬盘上,这样即使宕机,数据依然存在。在服务器重启后只需要把“照片”中的数据恢复即可。
RDB持久化就是把当前进程的数据在某个时刻生成快照(一个压缩的二进制文件)保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
1.1 RDB文件的创建
RDB文件的创建可以手动触发,也可以自动触发。
1.1 手动触发
手动触发分别对应save和bgsave命令:
1.1.1 save命令
save命令会阻塞当前Redis服务器,直到RDB过程完成为止。在服务器进程阻塞期间,服务器不能处理任何命令请求。因此,当save命令正在执行时,客户端发送的所有命令都会被拒绝,知道save命令执行完毕。
redis>save //等待,直到RDB文件创建完毕
ok
注意:
Redis的单线程模型就决定了,我们要尽量避免所有会阻塞主线程的操作,由于Save命令执行期间阻塞服务器进程,对于内存比较大的实例会造成长时间阻塞,因此线上环境不建议使用。
1.1.2 bgsave命令
bgsave命令会派生出一个子进程(而不是线程),由子进程进行RDB文件创建,而父进程继续处理命令。
redis>bgsave
Background saving started //直接返回,由子进程进行RDB文件创建
redis> //继续处理其它命令
注意:
- 在bgsave命令执行的时候,为了避免父进程与子进程同时执行两个rdbSave的调用而产生竞争条件,客户端发送的save命令会被服务器拒绝。
- 如果bgsave命令正在执行,bgrewriteaof(aof重写)命令会被延迟到bgsave命令之后执行,如果bgrewriteaof命令正在执行,那么客户端发送的bgsave命令会被服务器拒绝。
- 虽然bgsave命令是由子进程进行RDB文件的生成,但是fork()创建子进程的时候会阻塞父进程(详情请往下看)。
1.2 自动触发
因为bgsave命令可以在不阻塞服务器进程的情况下保存,所以redis可以通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次bgsave命令。如:我们向服务器设置如下配置(这也是redis默认的配置):
save 900 1
save 300 10
save 60 10000
那么只要满足如下条件中的一个bgsave命令就会被执行:
- 服务器在900秒内对数据库进行了至少1次修改
- 服务器在300秒内对数据库进行了至少10次修改
- 服务器在60秒内对数据库进行了至少10000次修改
1.2 RDB文件的载入
在Redis启动的时候,只要检测到RDB文件的存在,就会自动加载RDB文件。需要注意的是
因为AOF文件的更新频率通常比RDB文件的更新频率高,所以口如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。
只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。
注意:服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止
2 内存快照的问题
了解了什么是Redis的RDB持久化,我们来思考两个问题。
2.1 快照的时候数据可以修改吗
Redis RDB持久化是对某一时刻
的内存中的全量数据
进行拍照。这让我们不得不思考,快照的时候数据可以修改吗?
首先,如果我们使用save
命令做持久化,那么由于Redis单线程模型的原因,在持久化的过程中会阻塞,是不能执行其它命令的。也许有人会说可以使用bgave
命令,但使用bgsave
就没有问题了吗?
我们在拍照的时候,通常摄影师是不让我们动的,因为一动可能照片就模糊了。在Redis 进行内存快照的时候也会如此。如果我们持久化的过程中,有些数据被修改了。那么就会破坏快照的正确性与完整性。
比如在t时刻,我们对内存进行快照,此时我们希望的是记录下来t时刻内存中所有的数据,假设我们的RDB操作需要10s的时间,而t+2s我们执行了一个修改操作把Key1
的值由A修改成了B,而此时RDB操作却还没有把Key1
的值写入磁盘。在t+5s的时候读取到key1
的值写入磁盘。那么此次快照记录的Key1
的值就是B,而不是t时刻的A。这样就破坏了RDB文件的正确性。
RDB文件的生成是需要时间的,如果快照执行期间数据不能被修改,对于业务系统来说不能接受的。那么Redis 是如何解决这个问题的呢?
Redis 借助了操作系统提供的写时复制技术(Copy-On-Write, COW),可以让在执行快照的同时,正常处理写操作。简单来说,bgsave fork子进程的时候,并不会完全复制主进程的内存数据,而是只复制必要的虚拟数据结构,并不为其分配真实的物理空间,它与父进程共享同一个物理内存空间。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作,那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据,此时会给子进程分配一块物理内存空间,把要修改的数据复制一份,生成该数据的副本到子进程的物理内存空间。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。
2.2 可以频繁进行快照操作吗
假设我们在t 时刻做了一次快照,然后又在 t+n 时刻做了一次快照,而在这期间,发生了数据修改。而此时宕机了,那么,只能按照 t 时刻的快照进行恢复。那么这n秒的数据就彻底丢失无法恢复了。
所以,要想尽可能恢复数据,就只能缩短快照执行的时间间隔,间隔的时间越小,丢失数据也就越少。那么可以频繁的执行快照操作吗?
我们知道bgsave 执行时并不阻塞主线程,但是这不代表可以频繁执行快照操作。
一方面,持久化是一个写入磁盘的过程,频繁将全量数据写入磁盘,会给磁盘带来很大压力,频繁执行快照也容易导致前一个快照还没有执行完,后一个又开始了,这样多个快照竞争有限的磁盘带宽,容易造成恶性循环。
再者,bgsave所fork出来的子进程执行操作虽然并不会阻塞父进程的操作,但是fork
出子进程的操作却是由主进程完成的,会阻塞主进程,fork子进程需要拷贝进程必要的数据结构,其中有一项就是拷贝内存页表(虚拟内存和物理内存的映射索引表),这个拷贝过程会消耗大量CPU资源,拷贝完成之前整个进程是会阻塞的,阻塞时间取决于整个实例的内存大小,实例越大,内存页表越大,fork阻塞时间也就越久。
也许有人会想到是否可以做增量快照呢?也就是只对上一次快照之后的数据做快照。
首先思路肯定是可以,但是增量快照要求记住哪些数据上一次快照之后产生的。这就需要额外的元数据来记录这些信息,会引入额外的空间消耗。这对于内存资源宝贵的 Redis 来说,并不是一个很好的方案。
如果不能频繁执行快照操作,那么该如何解决两次快照之间的数据丢失的问题呢?Redis 还提供了另外一种持久化方式——AOF(append to file)日志。
关于AOF日志请看Redis持久化——AOF日志
Redis持久化——内存快照(RDB)相关推荐
- Redis持久化数据之RDB和AOF
文章目录 一.RDB(Redis DataBase) 概述 持久化过程 配置 优势和劣势 二.AOF(Append Of File) 概述 AOF持久化过程 AOF 配置 Rewrite 压缩 优势和 ...
- Redis核心技术与实战-学习笔记(五)内存快照RDB
一.为什么需要RDB AOF 方法优势:每次执行只需要记录操作命令,需要持久化的数据量不大.在进行写后日志只要不采用always(同步写回)的持久化策略就不会对性能造成太大影响. AOF方法劣势:AO ...
- 17.Redis系列之快照RDB方式持久化
本文学习redis两大持久化技术之一:RDB(redis database)快照方式持久化备份与还原,以及RDB方式的优缺点 1. RDB相关配置 首先我们先简单了解下Redis7中RDB相关配置 / ...
- Redis持久化:AOF和RDB
持久化(persistence) Redis 持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapsh ...
- redis 持久化详解 RDB和AOF 优缺点
本文将先说明上述几种技术分别解决了Redis高可用的什么问题:然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案:在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久 ...
- Redis持久化机制(RDB VS AOF)
Redis持久化机制 Redis持久化机制由来 一.RDB机制 1.1 工作原理 1.2 RDB的配置 1.3 修改RDB配置的快照策略 1.3.1 自定义RDB持久化策略 1.3.2 服务宕机RDB ...
- Redis持久化方式之RDB
目录 绪论 RDB RDB备份方式 自动备份 手动备份 实现过程 触发时机 恢复数据 RDB持久化配置 优缺点 实践演示 绪论 redis持久化机制主要是将内存中的数据持久化到磁盘文件中,一种是RDB ...
- Redis持久化中的RDB、AOF以及混合模式
Redis持久化 1 RDB 在指定的时间间隔内将内存中的数据以快照的形式保存到磁盘 过程: 1 客户端执行bgsave命令,redis主进程收到指令并判断此时是否在执行bgrewriteaof, 如 ...
- Redis持久化、备份:RDB和AOF
RDB持久化与文件相关配置 1.RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照.简单来说就是把内存中的所有数据都记录到磁盘中.当R ...
最新文章
- Linux使用Shell脚本实现ftp的自动上传下载
- java中的深浅拷贝
- 咦?奇怪的知识又增加了?以数学建模的方式打开海啸传播模型(附部分matlab源码)
- Unity重置Animator到初始状态和重复播放同一个Animation
- Pixhawk飞控源码目录结构及编译流程分析
- android图片编解码architecture
- Oracle 数据库
- android -------- 解决NDK开发中的 Method 'NewStringUTF' could not be resolved
- 辽宁交通高等专科学校计算机专业宿舍,辽宁省交通高等专科学校宿舍怎么样 住宿条件好不好...
- springmvc获取url对应的controller,并拦截记录每次访问的controller方法
- OraclePLSQL 安装及乱码问题解决
- 【知识点总结】计算机操作系统
- 巅峰阁批量卡android,卡iPhoneQQ在线
- 区块链技术应用在金融领域之大数据风控
- html页面清空标签里的内容
- VSCode 使用 minify 手动压缩JS, CSS, HTML
- 2D激光雷达和视觉相结合的SLAM概述
- linux节点状态 slurm,linux – 为什么slurm中的作业在TensorFlow脚本中无限期冻结?
- 【MySQL】MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
- RTX3060功耗多大 RTX3060配什么电源
热门文章
- 2008 r2 server 提权_Windows Server 2012 R2的提权过程解析
- Hyperledger Fabric 2.x 单机部署多节点网络
- mysql 读未提交数据_mysql事务之未提交读(Read uncommitted)
- 如何快速的在Windows自带cmd生产文件的MD5数值
- mysql 设置计算列_mysql – 创建计算列
- 【论文阅读】Density estimation using Real NVP
- 视频教程-从如何应聘运营工作到运营高手之路-运营管理
- Vue---Vuex状态管理核心
- 【双11狂欢大促】实验室4年来最大折扣,羊毛提前褥,错过再等一年!
- 从零开始的STM32F1课程学习(STM32CubeMX)