持久化功能
redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器
重启之后会把硬盘中的数据恢复到内存(redis)的里边。

数据保存到硬盘的过程就称为“持久化”效果。

redis有两种持久化功能,一种是“快照持久化”,一种是“AOF持久化”。

1.snap shotting快照持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多
(10-20G)就不合适频繁操作该持久化操作。

我们的快照持久化在硬盘中保留的备份在:


默认的文件名为dump.rdb

在我们的redis安装目录下有一个redis.conf配置文件,其中就有快照持久化的配置:


上图配置的就是快照持久化的“备份频率”。
以上三个save的意思:
数据修改的频率非常高,备份的频率也高
数据修改的频率低,备份的频率也低

以上的配置三个都不能缺少,这样能保证不管修改数据频率高还是低的情况,数据都会保存。

其中快照持久化的文件的名称和存储位置在配置文件中也有配置:

手动发起快照持久化:
我们首先在Redis中加入一些数据:


我们添加了好多testN的数据,为了持久化这些变化,我们手动发起快照持久化:

可以看到,原来备份文件时间未11月12日,现在变为了程序修改的20日了:


我们看一看我们的缓存文件中都保存了什么:


我们之前的改动都有记录在备份文件中。

redis的持久化相关指令:
bgsave 异步保存数据到磁盘(快照保存)
lastsave 返回上次成功保存到磁盘的unix时间戳
shutdown 同步保存到服务器并关闭redis服务器
bgrewriteaof 当日志文件过长时优化AOF日志文件存储

快照持久化缺点:
一下是一次快照的模拟:

每隔一个小时做一次快照持久化

可以看到,我们在10:00-11:00的时候断电了,按照我们每一个小时做的快照持久化来看,
11:00才执行的快照,就无法挽回10:00-10:55分的数据。

解决方案:
每隔一个小时做一次快照持久化

在每一个小时内,我们做“精细持久化”,也就是每修改一个key就保存起来,
并且频率可以达到秒级。不管你1秒内修改了多少key,只做一次持久化,这样
也比较节省内存。

上面所说的“精细持久化”也就是Redis的第二种持久化方法---append only file(AOF持久化)。

2.append only file(AOF持久化)

回想一下,mysql数据库的备份也就是备份了一些sql语句,还原的时候执行sql语句就就行了。
其实AOF持久化就是类似的操作。

AOF持久化本质:把用户执行的每个“写”指令(添加/修改/删除)都备份到文件中,还原数据的时候
就是执行具体写指令而已。

开启AOF持久化(会清空redis内部的数据,最好在redis使用之前就开启它)
我们在redis.conf配置文件中可以找到它:


将“no”改为“yes”,就开启了快照持久化。
我们也可以更改AOP持久化文件名称(文件位置与dump.rdb同一目录)。

配置文件被修改后,要删除旧的进程,再根据新的配置文件启动新进程:

然后就可以在同级目录下,发现一个AOF持久化备份文件appendpnly.aof

然后就发现所有的数据全部清空了(默认)


数据库0-15数据库都是空的。

我们在数据库0中创建了三个key

然后回到根目录看一下备份文件,发现时间和大小都有所改变:

然后查看一下内容:


发现我们写的指令全部都备份进去了,说明备份频率还是十分高的。

在redis.conf中,可以调整AOF备份的频率:


有三种备份方式:
(1)always
一写指令就备份一次。这样做虽然安全,但是系统性能会降低。不推荐使用

(2)everysec
每一秒中备份一次。不管一秒钟变化了多少key,只备份一次,性能得到一定的保护。推荐使用。

(3)no
会查看当前服务器状态,如果状态良好,就进行备份(随机)。这种备份方式数据是没有保证的。

对比下来,性能:always<everysec<no,而数据安全:always>everysec>no。

我们做一个例子,创建一个num数据,使用incr指令对其每过一秒自增一次:

我们查看我们的appendonly.aof文件,看看备份情况:



其实自增10次(10个incr num)就相当于一个set num 10,如果只存储“set num 10”,那么
备份文件的存储空间就会节省了一些。这就牵扯到了我们如何“为aof备份文件做优化处理”。

3.为AOF备份文件做优化处理

所谓优化,其实就是把AOF备份文件中所有的备份数据的内容进行一个处理。

在启动redis客户端的时候,使用bgrewriteaof指令,就可以对aof备份文件的内容进行
优化压缩处理。

我们可以发现aof的大小由字节变为字节,证明其内容被压缩了

看一下其中的内容,发现备份数据存储指令变了:


果然,10次的incr num变成了一次的set num 10

总结:
快照持久化和AOF持久化是一种互补的关系,快照持久化用来做大的备份,
而AOF持久化用来做做精细备份。
数据还原的时候,快照持久化和AOF持久化可以一起来还原。
还原的时候也十分简单,在任何一台服务器上,只要拿到备份文件,都可以进行数据备份。

至此,两种持久化方式介绍完毕。

转载请注明出处:http://blog.csdn.net/acmman/article/details/53421960

9.快照持久化和AOF持久化的更多相关文章

  1. 详解Redis RDB持久化、AOF持久化

    1.持久化 1.1 持久化简介 持久化(Persistence),持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘). 1.2 red ...

  2. 《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化

    欢迎关注文章这一系列,一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇> <实战演练,拒绝996篇> 如果此文对你有帮助.喜欢的话,那就点个赞呗,点个关注 ...

  3. Redis数据持久化之AOF持久化

    一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...

  4. Redis数据持久化—RDB持久化与AOF持久化

    目录 Redis数据持久化-RDB持久化与AOF持久化 RDB持久化 RDB文件的创建 RDB文件的载入 自动间隔性保存 检查保存条件是否满足 AOF持久化 AOF持久化的实现 AOF文件的载入与数据 ...

  5. Redis的两种持久化方式-快照持久化和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...

  6. redis系列:RDB持久化与AOF持久化

    前言 什么是持久化? 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中.XML数 ...

  7. redis之RDB持久化与AOF持久化

    Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态. 因为Red ...

  8. redis 笔记03 RDB 持久化、AOF持久化、事件、客户端

    RDB 持久化 1. RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据. 2. SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器. 3. BGSAVE由子进程执行保 ...

  9. Redis使用RDB持久化和AOF持久化的区别 - 小白之所见

随机推荐

  1. ACM学习总结 6月11日

    经过这几天没有队友的协助,又是算法题比较多,有点碰触到自己的短板,因为搜索的题目就做了1个,一遇到搜索就跳过,DP也有点忘得差不多了,四边形优化,斜率优化还不会,这是下一阶段努力方向,把之前做过的题, ...

  2. C# 9.0 新特性预览 - 类型推导的 new

    C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...

  3. 前端——localStorage详细总结

    一.localStorage简介: 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cooki ...

  4. Day_08【面向对象】扩展案例3_使用多态的形式创建缉毒狗对象,调用缉毒方法和吼叫方法

    分析以下需求,并用代码实现: 1.定义动物类: 行为: 吼叫:没有具体的吼叫行为 吃饭:没有具体的吃饭行为 2.定义缉毒接口 行为: 缉毒 3.定义缉毒狗:犬的一种 行为: 吼叫:汪汪叫 吃饭:狗啃骨 ...

  5. 【Kafka】Consumer API

    Consumer API Kafka官网文档给了基本格式 http://kafka.apachecn.org/10/javadoc/index.html?org/apache/kafka/client ...

  6. 利用Asp.net和Sql Server实现留言板功能

    本教程设及到:使用SQL Server查询分析器创建数据库:SQL查询语句常用的一些属性值:触发器创建和使用:存储过程的创建,ASP使用存储过程. 正文: 一.创建数据库: 创建一个feedback数 ...

  7. Istio的流量管理(实操一)(istio 系列三)

    Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...

  8. gets() 、 getchar() 、 getch() 、getche()、gets()、 scanf()的区别

    1.getchar().getche().getch() (1).getchar 函数用于从标准输入设备键盘读入单个字符,返回表示读入字符的ASCII码值,并在屏上显示该字符:头文件是 stdio.h ...

  9. java ->EL技术&JSTL技术

    EL技术 EL 表达式概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本(java代码)的编写. EL从域中取出数 ...

  10. 黑马程序员_毕向东_Java基础视频教程——进制的相互转换(随笔)

    进制的相互转换 二进制转十进制: 原理对十进制数进行除2运算(余数不是0 就是1) 6 的二进制: 6 / 2 = 3--0 3 / 2 = 1--1 1 / 2 = 0--1 余数倒序排列输出:11 ...