Redis持久化之RDB和AOF

Redis持久化之RDB和AOF

  • Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File);

RDB 详解

  • RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据

从配置文件了解RDB

  • 打开redis.conf文件,ctrl+f搜索SNAPSHOTTING,查看对应的内容
    • RDB核心规则配置(重点)
      # save <seconds> <changes>
      # save <指定时间间隔> <执行指定次数更新操作>
      # save ""
      save 900 1
      save 300 10
      save 60 10000
      /*
      满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。
      若不想用RDB方案,可以把 save "" 的注释打开
      */

      指定本地数据库文件名,一般采用默认的sump.rdb

    • 指定本地数据库存放目录,一般也用默认配置 dir  ./

    • 默认开启数据压缩 rdbcompression yes:配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启

触发RDB快照

  • 在指定的时间间隔内,执行指定次数的写操作
  • 执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令
  • 执行flushall 命令,清空数据库所有数据,意义不大。
  • 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义...也不大

通过RDB文件恢复数据

  • 将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 

RDB 的优缺点

优点

  • 适合大规模的数据恢复。
  • 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点

  • 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。

  •  备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。

  • 所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。

注意事项

  • SHUTDOWN 和 FLUSHALL 命令都会触发RDB快照,这是一个坑,请大家注意

AOF 详解

AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

从配置文件了解AOF

  • 打开 redis.conf 文件,找到 APPEND ONLY MODE 对应内容
  • redis 默认关闭,开启需要手动把no改为yes:appendonly yes
  • 指定本地数据库文件名,默认值为 appendonly.aof:appendfilename "appendonly.aof"
  • 指定更新日志条件
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    /*
    always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
    everysec:出厂默认推荐,每秒异步记录一次(默认值)
    no:不同步
    */

    配置重写触发机制

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    /*当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。一般都设置为3G,64M太小了*/

     

触发AOF快照

  • 根据配置文件触发,可以是每次执行触发,可以是每秒触发,可以不同步

根据AOF文件恢复数据

  • 正常情况下,将appendonly.aof 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。但在实际开发中,可能因为某些原因导致appendonly.aof 文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。从下面的操作演示中体会
  • 此处的bin文件夹,是我们人为创建的,其中就是我们通过make install之后,在src文件夹里面生成的可执行的文件

AOF的重写机制

  • 前面也说到了,AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以 Redis 新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容进行压缩
  • 重写的原理:Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中,并没有读取旧文件。最后替换旧的aof文件。
  • 触发机制:当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改

AOF 的优缺点

优点:

  • 数据的完整性和一致性更高

缺点:

  • 因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢

总结

  1. Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
  2. RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
  3. Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
  4. AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。
  5. Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
  6. 若只打算用Redis 做缓存,可以关闭持久化。
  7. 若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份。AOF出问题了,还有RDB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同为程序员 为什么我的工资最低

我看着工资单上每一个开发团队成员的薪水&#xff0c;慢慢地我不能保持淡定了。 而当我看到我的工资排名是倒数的时候——靠近最后一名——我不由得倒抽一口冷气。就像圣诞故事中的那个可爱的小男孩Ralphie &#xff0c;想买气枪却被忽悠会有危险一样&#xff0c;我也不断忽悠…

Docker安装Redis以及配置Redis环境

1&#xff0c;下载Redis镜像 首先拉取 Redis 镜像, 这里我选择的是 redis:alpine 轻量级镜像版本 docker pull redis:alpine 下载完成后&#xff0c;通过 docker images 查看我们已经下载的镜像&#xff0c;看看是否已经下载到本地 2&#xff0c;运行 Redis 容器 docker run …

.NET程序性能的基本要领

摘要&#xff1a;本文分享了性能优化的一些建议和思考&#xff0c;比如不要过早优化、好工具很重要、性能的关键&#xff0c;在于内存分配等。开发者不要盲目的没有根据的优化&#xff0c;首先定位和查找到造成产生性能问题的原因点最重要。 【编者按】Bill Chiles&#xff08…

redis.conf配置文件详解

基本配置 daemonize no #是否以后台进程启动databases 16 #创建database的数量(默认选中的是database 0)save 900 1 #刷新快照到硬盘中&#xff0c;必须满足两者要求才会触发&#xff0c;即900秒之后至少1个关键字发生变化save 300 10 #必须是300秒之后至少10个关键字发生变…

什么原因成就了一位优秀的程序员?

这些年我曾和很多程序员一起工作&#xff0c;他们之中的一些人非常厉害&#xff0c;而另一些人显得平庸。不久前因为和一些技术非常熟练的程序员工作感觉很愉快&#xff0c;我花了一些时间在考虑我佩服他们什么呢&#xff1f;什么原因让优秀的程序员那么优秀&#xff0c;糟糕的…

Redis的哨兵模式Sentinel

sentinel功能 redis的sentinel系统用于管理多个redis服务器&#xff0c;该系统主要执行三个任务&#xff1a;监控、提醒、自动故障转移。 1、监控&#xff08;Monitoring&#xff09;&#xff1a; Redis Sentinel实时监控主服务器和从服务器运行状态&#xff0c;并且实现自动…

csdn 到底怎么了?不准转载?

我转载了20多文章&#xff0c;很多人阅读过&#xff0c;但是今天看到阅读量是0&#xff0c; csdn 到底怎么了&#xff1f; 对用户这样&#xff1f;请大家看看是不是这样&#xff1f;

python3之后版本读取网页的内容

import urllib.request url "http://helloworldbook2.com/data/message.txt" #直接通过url来获取网页数据 print(第一种) response urllib.request.urlopen(url) code response.getcode() html response.read() mystr html.decode("utf8") response.c…

三十功名尘与土——资深程序员生涯自白

摘要&#xff1a;作者Codist&#xff08;网名&#xff09;在程序员岗位上工作了三十多年&#xff0c;在这期间他悟出了一些真理&#xff0c;比如&#xff0c;成功来自对失败的总结学习&#xff1b;条条大路通罗马&#xff0c;罗马并不在乎你用什么方式到达。你在生活中积累了哪…

linux/unix核心设计思想

1&#xff09; 程序应该小而专一&#xff0c;程序应该尽量的小&#xff0c;且只专注于一件事上&#xff0c;不要开发那些看起来有用但是90%的情况都用不到的特性&#xff1b; 2&#xff09; 程序不只要考虑性能&#xff0c; 程序的可移植性更重要&#xff0c;shell和perl&…

操作系统环境变量

在 Java中&#xff0c;许多类都是 Iterable &#xff0c;主要包括所有的 Collection 类&#xff08;但不包括各种 Maps &#xff09;。 例如&#xff0c;下面的代码可以显示所有的操作系统环境变量&#xff1a; // collections/EnvironmentVariables.java // {VisuallyInspect…

用Unix的设计思想来应对多变的需求

摘要&#xff1a;无论是Unix设计&#xff0c;还是面向对象设计&#xff0c;还是别的什么如SOA&#xff0c;ECB&#xff0c;消息&#xff0c;事件&#xff0c;MVC&#xff0c;网络七层模型&#xff0c;数据库设计&#xff0c;等等&#xff0c;他们都在干三件事——解耦&#xff…

学习较底层编程:动手写一个C语言编译器

动手编写一个编译器&#xff0c;学习一下较为底层的编程方式&#xff0c;是一种学习计算机到底是如何工作的非常有效方法。 编译器通常被看作是十分复杂的工程。事实上&#xff0c;编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。…

Arrays.deepToString() 方法同时适用于基元数组和对象数组

Arrays.deepToString() 方法同时适用于基元数组和对象数组&#xff1a; import java.util.*;public class MultiDimWrapperArray {public static void main(String[] args) {Integer[][] a1 { // Autoboxing{ 1, 2, 3, },{ 4, 5, 6, },};Double[][][] a2 { // Autoboxing{ {…

高效程序员的7个共同特征

要想成为高效的程序员&#xff0c;你需要具备一定的综合素质才能够让你用你所掌握的技能、经验和知识编写出有效的代码。有一些开发人员在技术方面具备一定的技巧&#xff0c;但他们永远无法成为高效的程序员&#xff0c;就是因为他们缺乏所需的其它几项特质。本文将给出成为一…

java.util.Array中的方法

概述 asList(): 获取任何序列或数组&#xff0c;并将其转换为一个 列表集合 &#xff08;集合章节介绍了此方法&#xff09;。 copyOf()&#xff1a;以新的长度创建现有数组的新副本。 copyOfRange()&#xff1a;创建现有数组的一部分的新副本。 equals()&#xff1a;比较两…

有关编程的12个猜想

摘要&#xff1a;编程世界的将来如何目前仍难预料&#xff0c;但可以肯定的一点是技术一直在加速发展。本文搜罗出12个独特的编程视角猜想&#xff0c;一起来看看有哪些猜想在不久的将来就能变为现实。 编程世界的将来如何目前仍难预料&#xff0c;但可以肯定的一点是技术一直…

面试中如何剔除“鱼目混珠”程序员?

公司招聘面试事宜是一个耗时耗钱的项目&#xff0c;从挑选简历开始&#xff0c;还要花更多的时间面试候选人。有的时候这些人才机构会向你保证这些人都是Java天才、SQL专家、堆栈开发者等等&#xff0c;但实际上真实情况远不及你想想的。对于一个公司来说&#xff0c;执行招聘面…

InputStream 类型

输入流类型 I/O-1 类功能构造器参数如何使用ByteArrayInputStream允许将内存的缓冲区当做 InputStream 使用缓冲区&#xff0c;字节将从中取出作为一种数据源&#xff1a;将其与 FilterInputStream 对象相连以提供有用接口StringBufferInputStream将 String 转换成 InputStr…

java容器相关问题

同步类容器 1&#xff0c;这些复合操作在多线程并发地修改容器时&#xff0c;可能会表现出意外的行为&#xff0c;最经典的便是ConcurrentModificationException&#xff0c;原因是当容器迭代的过程中&#xff0c;被并发的修改了内容&#xff0c;这是由于早期迭代器设计的时候…