redis 是如何做持久化的
Redis 是一个键值对数据库服务器。基于内存存储数据,它常被用做缓存数据库,用来替代 memcached。官网:https://redis.io/
什么是持久化?
持久化,指将数据存储到可永久保存的设备中。
例如,将内存中的数据存储到可永久保存的硬盘中。
为什么需要持久化?
- Redis 基于内存存储,内存掉电后数据会丢失
- 内存比硬盘贵得多,所以需要将一些不能丢失的数据持久化到硬盘上
甚至,一些特别重要的数据,是需要存到 MySQL 的。
Redis 本身有持久化,为什么还要写进 mysql 呢?:https://www.v2ex.com/t/219551
如何做持久化?
Redis 提供了四种持久化方式:
- RDB(Redis database|Snapshoting)
- AOF(Append-Only file)
VM(虚拟内存)被淘汰了Diskstore 不了解
这次主要说的是 RDB 和 AOF 两种持久化方式。
RDB 持久化
RDB:Redis database 的简称。一看这个,你就应该能猜到,这是 Redis 的默认持久化方式。
RDB 中持久化生成的是一个经过压缩的二进制文件。
RDB 持久化时机:
- 在客户端执行 SAVE 或者 BGSAVE
- 根据配置规则自动快照(稍后会讲到)
- 执行 FLUSHALL 命令
- 执行复制(replication)
RDB 持久化步骤:
- fork 复制出一个父进程的副本子进程
- 子进程将内存中的数据写入到硬盘中的临时文件
- 将临时文件替换旧的 rdb 文件

自动间隔保存(配置规则):
save 900 1 # 每900秒检查一次,如果有1条数据修改了,那么执行 rdb
save 300 10 # 每300秒检查一次,如果有10条数据修改了,那么执行 rdb
save 60 10000 # 每60秒检查一次,如果有10000条数据修改了,那么执行 rdb
RDB 文件还原
服务器启动时,会直接载入 RDB 文件。
但是如果 AOF 文件存在,则会载入 AOF 文件。AOF 文件载入过程会在后文中描述
AOF 持久化
AOF 是 Append Only File 的简称。
AOF 通过保存客户端传过来的写命令来记录数据库的状态。
如:
$3(后面是 \r\n)
SET
$3
msg
$1
5
$3
SET
$3
msg
$1
3
AOF 持久化的时机
需要在配置文件中加入:
appendonly yes
AOF 持久化的步骤
主进程进行如文章末尾所示的三个步骤:
- 命令追加
- 文件写入
- 文件同步
AOF 重写的时机
- 配置:
# 当前 AOF 文件超过上次重写时的 AOF 文件大小的百分之多少时再次进行重写
# 如果之前没有冲写过,则以启动时的 AOF 文件大小为依据。
auto-aof-rewrite-percentage 100
# 允许重写的最小值
auto-aof-rewrite-min-size 64mb
- 主动执行 BGREWRITEAOF 命令触发 AOF 重写。
AOF 重写步骤
如果是在客户端直接执行 REWRITEAOF ,会阻塞服务,直到重写完成,将新的 AOF 文件覆盖旧的文件。这种方式一般不会考虑。
BGREWRITEAOF 命令的执行过程如文末图片所示:
- 父进程写入 AOF 缓冲区和 AOF 重写缓冲区
- 子进程执行 AOF 重写,完成之后发送信号给父进程
- 父进程收到信号将 AOF 重写缓冲区的内容写入到新的 AOF 文件中,并且覆盖原有的 AOF 文件
AOF 重写是将多条命令用一条命令代替。
如上面代码所示,存储一个 msg 使用了两条命令。经过 AOF 文件重写之后,就会变成如下所示,大大减少了使用的存储空间:
$3
SET
$3
msg
$1
AOF 文件还原
AOF 文件还原的步骤如下:
- 创建一个伪客户端(fake client)
- 从 AOF 文件中分析并读取一条写命令
- 使用伪客户端执行写命令
- 一直重复步骤 2 和 3
AOF 写入与重写过程图:

redis 是如何做持久化的的更多相关文章
- redis做持久化的两种方式,RDB、AOF讲解
redis的两种持久化方式: 1.RDB方式 概念:在指定的时间间隔内保存数据快照 实现方式: 找到redis的安装目录,修改redis的配置文件(redis.conf):① 修改备份的时间间隔:sa ...
- Redis怎么做持久化
1.redis持久化的两种方式 2.两种持久化方式区别 3.两种持久化方式的使用场景 1.Redis 是内存型数据库,一般来用作缓存.保存在内存的数据有一个特点, 就是断电消失,因此一旦 Redis ...
- Redis系列三之持久化
一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...
- Redis教程(十):持久化详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...
- [转载] redis 的两种持久化方式及原理
转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串 ...
- Redis的两种持久化方式-快照持久化和AOF持久化
Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...
- 第一章· Redis入门部署及持久化介绍
Redis简介 Redis安装部署 Redis持久化 Redis简介 软件说明: Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. ...
- Redis(四)-持久化
1.Redis将所有数据存储在内存中,从内存同步到磁盘上,就做持久化过程. 2.持久化有两种方式:rdb(Redis Database)和aof(Append of file) # rdb持久化方法: ...
- Spring+Redis集成+关系型数据库持久化
本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...
随机推荐
- vc有关 directx组态,和dxsdk_extras(directshow)
2009-11-10 0:28 此文章:自己编写 转载于<汤姆&杰瑞> DirectShow 1 -- 下载与VC配置 1 DirectX SDK9 Directshow sd ...
- Linux(CentOS 7)+ Nginx(1.10.2)+ Mysql(5.7.16)+ PHP(7.0.12)完整环境搭建
首先安装Linux系统,我以虚拟机安装来做示例,先去下载 VitualBox,这是一款开源的虚拟机软件,https://www.virtualbox.org 官网地址.或者是VMware,www.vm ...
- C/S和B/S两种架构区别与优缺点分析
C/S和B/S,是再普通不过的两种软件架构方式,都可以进行同样的业务处理,甚至也可以用相同的方式实现共同的逻辑.既然如此,为何还要区分彼此呢?那我们就来看看二者的区别和联系. 一.C/S 架构 1. ...
- JS 三个对话框
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 怎么给开源项目提PR?
1. fork 你要的项目 2. 下载到本地 相关步骤如下 在你需要的文件夹下面,右键 git bash 命令,打开 git 命令框 执行如下指令可将项目代码下载到当前目录 ~~~ git clone ...
- windows下捕获dump之Google breakpad_client
breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...
- Android之Log封装
blog原文地址:http://yuxingxin.com/2015/10/26/AndroidLog/ Github:https://github.com/fallblank/CodeEssay
- kafka 遇到的错
D:\cluster\kafka_2.->.\bin\windows\kafka-topics.bat --create --zookeeper localhost: --replication ...
- CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)
所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...
- Microsoft.Ace.OleDb.12.0 操作excel
在用c#操作excel的时候,碰到了一下的问题: 1.Microsoft.Ace.OleDb.12.0未安装,可以到下载2007 Office system 驱动程序AccessDatabaseEng ...