两种持久化策略

1.AOF:记录每一次的写操作到日志上,重启时重放日志以重建数据
2.RDB:每隔一段时间保存一次当前时间点上的数据快照
    快照就是一次又一次地从头开始创造一切
3.可以关闭持久化
4.在持久化上、AOF好一些,但AOF依然存在不如RDB的地方
AOF
优点
    多种策略可以选择:是每秒同步一次(默认,灾难发生会丢失1秒的数据)、还是每次请求时同步一次(超级慢 + 超级安全)、从不执行同步。
    日志使用追加模式;当日志太大时Redis会重新创建一个日志写
    重写日志是安全的,Redis一边会在旧的日志上追加,一边会创建新的日志文件,一旦新日志创建完毕,就往新文件上追加
缺点
    AOF文件显然占据大量存储空间
    举例:对count = 1累加100次,最终的结果是count对应的值只会有一个,就是100;但是AOF文件里面却有100条记录
当你恢复的时候他会超级费时的重复这些操作(浪费!)
    AOF比RDB慢,有延迟
    bug比RDB多
     AOF文件损坏后就麻烦了,redis-check-aof --fix命令用于修复
RDB
优点
    对于每个一段时间要保存一下数据特别适用。如:每隔24小时保存一次数据
    可以保存不同时间点的rdb(通过复制备份,看下文),然后你可以恢复不同时间点的数据库
    由于保存的是整个库,所以恢复大数据集特别快
    启动子进程来处理RDB文件的写入
缺点
    在时间间隔内挂掉的话数据会丢失,要做好一定会丢失数据的准备
    RDB 需要经常调用 fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且 CPU 性能不够强大的话,Redis 会停止服务客户端几毫秒甚至一秒
选择谁
如果可以接受丢失几分钟的数据,选择RDB吧!

如何配置
配置RDB
默认开启RDB
在redis.conf文件里面可以看到RDB策略

################################ SNAPSHOTTING ################################

#Save the DB on disk:

#save

#Will save the DB if both the given number of seconds and the given

#number of write operations against the DB occurred.

#In the example below the behaviour will be to save:

#after 900 sec (15 min) if at least 1 key changed

#after 300 sec (5 min) if at least 10 keys changed

#after 60 sec if at least 10000 keys changed

#Note: you can disable saving completely by commenting out all "save" lines.

#It is also possible to remove all the previously configured save

#points by adding a save directive with a single empty string argument

#like in the following example:

#save ""

save 900 1
save 300 10
save 60 10000

#By default Redis will stop accepting writes if RDB snapshots are enabled

#(at least one save point) and the latest background save failed.

#This will make the user aware (in a hard way) that data is not persisting

#on disk properly, otherwise chances are that no one will notice and some

#disaster will happen.

#If the background saving process will start working again Redis will

#automatically allow writes again.

#However if you have setup your proper monitoring of the Redis server

#and persistence, you may want to disable this feature so that Redis will

#continue to work as usual even if there are problems with disk,

#permissions, and so forth.

stop-writes-on-bgsave-error yes

##Compress string objects using LZF when dump .rdb databases?

#For default that's set to 'yes' as it's almost always a win.

#If you want to save some CPU in the saving child set it to 'no' but

#the dataset will likely be bigger if you have compressible values or keys.

rdbcompression yes

#Since version 5 of RDB a CRC64 checksum is placed at the end of the file.

#This makes the format more resistant to corruption but there is a performance

#hit to pay (around 10%) when saving and loading RDB files, so you can disable it

#for maximum performances.

#RDB files created with checksum disabled have a checksum of zero that will

#tell the loading code to skip the check.

rdbchecksum yes

#The filename where to dump the DB

dbfilename dump.rdb

#The working directory.

#The DB will be written inside this directory, with the filename specified

#above using the 'dbfilename' configuration directive.

#The Append Only File will also be created inside this directory.

#Note that you must specify a directory here, not a file name.

dir ./
翻译一下
################################ 快照 #################################

Save the DB on disk:保存数据库到磁盘

save <秒> <更新>

如果指定的秒数和数据库写操作次数都满足了就将数据库保存。

下面是保存操作的实例:

900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)

300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)

60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)

 

注释:注释掉“save”这一行配置项就可以让保存数据库功能失效。

你也可以通过增加一个只有一个空字符串的配置项(如下面的实例)来去掉前面的“save”配置。

save ""

save 900 1
save 300 10
save 60 10000

#在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。
#这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。

#如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。

#然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。
#如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。
stop-writes-on-bgsave-error yes

#是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象?
#默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。
#如果你想在存储的子进程中节省一些CPU就设置成'no',
#但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。
rdbcompression yes

#从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。
#这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,
#所以,为了达到性能的最大化,你可以关掉这个配置项。

 

#没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。
rdbchecksum yes

#导出数据库的文件名称

dbfilename dump.rdb

#工作目录

#导出的数据库会被写入这个目录,文件名就是上面'dbfilename'配置项指定的文件名。

#只增的文件也会在这个目录创建(这句话没看明白)

##注意你一定要在这个配置一个工作目录,而不是文件名称。

dir ./

#配置AOF(我就直接上翻译后的配置文件了)
############################## APPEND ONLY MODE ###############################

#是否开启AOF,默认关闭(no)

appendonly yes

#指定 AOF 文件名

appendfilename appendonly.aof

#Redis支持三种不同的刷写模式:

appendfsync always #每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。

appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。

appendfsync no #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。

#在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
#设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no
no-appendfsync-on-rewrite no
#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
#当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
auto-aof-rewrite-min-size 64mb

如何工作的

每当 Redis 需要转储数据集到磁盘时,会发生:
Redis 调用 fork()。于是我们有了父子两个进程。
子进程开始将数据集写入一个临时 RDB / AOF 文件。
当子进程完成了新 RDB 文件,替换掉旧文件。
AOF的fork(),与RDB不同的是父进程会在一个内存缓冲区中积累新的变更,同时将新的变更写入旧的 AOF 文件,所以即使重写失败我们也安全。当子进程完成重写文件,父进程收到一个信号,追加内存缓冲区到子进程创建的文件末尾,接着自动重命名旧文件为新的,然后开始追加新数据到新文件
这个方法可以让 Redis 获益于写时复制(copy-on-write)机制。
备份数据(或者叫灾难恢复吧)
Redis运行时可以拷贝rdb文件,不可以拷贝aof
可以每隔一段时间复制一份rdb文件到安全区域并以时间点命名,这样可以根据时间点恢复数据库

聊聊Redis的持久化的更多相关文章

  1. Redis - 2 - 聊聊Redis的RDB和AOF持久化 - 更新完毕

    1.RDB 1.1).RDB是什么? RDB,全称Redis Database RDB是Redis进行持久化的一种方式,当然:Redis默认的持久化方式也是RDB 1.2).Redis配置RDB 1. ...

  2. Redis 之持久化

    目录 一.前言 二.持久化类型之 RDB 三.持节化类型之AOF 四.Redis 持久化类型的抉择 五.持久化的恢复 六.持久化问题的分析定位与优化 七.回顾总结 一.前言 首先,来回顾下前面文章的知 ...

  3. Redis AOF 持久化详解

    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Redis 提供了 RDB 和 ...

  4. 10分钟彻底理解Redis的持久化机制:RDB和AOF

    作者:张君鸿 juejin.im/post/5d09a9ff51882577eb133aa9 什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客 ...

  5. 聊聊redis实际运用及骚操作

    前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...

  6. 【redis】-- redis的持久化(作为数据库)

    目录 1.RDB rdb持久化的方式 rdb方式的优点: aof的优点 3.持久化的其他特性 日志重写 工作原理 rdb和aof混合使用 redis是一个基于内存的数据库,故在redis正在运行的数据 ...

  7. 10 分钟彻底理解 Redis 的持久化和主从复制

    在这篇文章,我们继续有关Redis方面知识的学习,一起了解一下其中一个非常重要的内容:Redis的持久化机制. 什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在 ...

  8. Redis的持久化机制:RDB和AOF

    什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示: 这样做有什么问题呢? 其实,只要稍微有点计算 ...

  9. Redis总结(四)Redis 的持久化

    前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化. redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来 ...

随机推荐

  1. 使用 Laravel-Excel 和流的方法导出 Excel

    1.使用 laravel-excel 扩展包导出 扩展包的 3.0 的版本和 2.0 相比做了很多的改动,个人感觉更容易使用了.扩展包给出了很多基于 query 的导出,视图的导出.下面例子为基于 a ...

  2. Spring Boot的27个注解【核心】

    导读[约定大于配置] Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务 ...

  3. java基础(四)之this的使用

    作用: 1.使用this调用成员变量和成员函数2.使用this调用构造函数 Person.java: class Person{ String name; //成员变量 void talk(Strin ...

  4. grunt里面将es6转为es5,遇到的坑

    今天看了一下grunt的官方文档,就按照教程来自己创建一个demo,发现grunt要把es6转化为es5需要安装babel,然后就按照grunt-babel的文档进行了一系列操作,等我要兴致勃勃的运行 ...

  5. AcWing 338. 计数问题

    #include <iostream> #include <algorithm> #include <vector> using namespace std; ; ...

  6. Linux gd库安装步骤说明

    gd 库是 PHP 处理图形的扩展库,它提供了一系列用来处理图片的 API(应用程序编程接口),使用 gd 库可以处理图片或者生成图片.在网站上,gd 库通常用来生成缩略图,或者对图片加水印,或者生成 ...

  7. HBase记录

    本次记录是用于:SparkStreaming对接Kafka.HBase记录 一.基本概念 1.HBase以表的形式存储数据.表有行和列族组成.列族划分为若干个列.其结构如下 2.Row Key:行键 ...

  8. Docker on startup: “No activity detected on VM, aborting”

    windows下安装的docker,切换到linux,一直处于重启中,最后报No activity detected on VM, aborting错误 上网百度一下这个错误,基本上没人遇到过,最后在 ...

  9. Java学习笔记(八)面向对象---抽象类

    当多个类中出现相同功能,但是功能主体不同时,我们可以向上抽取,只抽取功能定义,而不抽取功能主体. 抽象类的特点 抽象方法一定在抽象类中. 抽象方法和抽象类都必须被abstract关键字修饰. 抽象类不 ...

  10. python正则非贪婪模式

    上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 单个匹配 ...