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集成+关系 ...
随机推荐
- WPF Path实现虚线流动效果
原文:WPF Path实现虚线流动效果 最近闲来无事,每天上上网,看看博客生活也过得惬意,这下老总看不过去了,给我一个任务,叫我用WPF实现虚线流动效果,我想想,不就是虚线流动嘛,这简单于是就答应下来 ...
- Spring MVC 专题
Spring静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取.在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,c ...
- Java之"Mozilla Rhino"引擎(二)
在Java中使用Rhino, 能让你使用类似Groovy, ECMAScript...等等之类的不同动态脚本语言, 其中值得推荐的是ECMAScript, 它是Rhino的默认实现, 同时也在JDK1 ...
- WCF服务的IIS托管(应用程序)
基本思路 建立与发布参考网站托管 在IIS中某一网站,选择添加应用程序 访问服务uri:http://localhost/wcfAppTest/Service1.svcwcfAppTest/Ser ...
- Qt中事件处理的顺序
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:Qt中事件处理的顺序 文章内容主要来自 ...
- shell中select、case的使用
case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支. select select结 ...
- How to setup Assigned Access in Windows 10 (Kiosk Mode) 设置分配的访问权限(Kiosk模式)
Let’s say you’re building some sort of ingenious mechanical contraption to be displayed in public th ...
- .net EF Join 关联表分页查询
Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...
- Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总
一.目录 转载1: http://my.oschina.NET/fanhuazi/blog/737224?ref=myread 点击打开链接 转载2: http://www.qtcn.org/bbs/ ...
- list 多行表头 表头合并
http://blog.csdn.net/safedebug/article/details/52971685