持久化概述

持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。

Redis的数据存储在内存中,内存是瞬时的,如果linux宕机或重启,又或者Redis崩溃或重启,所有的内存数据都会丢失,为解决这个问题,Redis提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。

持久化方式

(一)RDB方式

Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。

RDB 保存了在某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是dump.rdb。RDB技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响Redis的正常使用。RDB恢复数据时比其他AOF速度快。

       实现方式

RDB方式的数据持久化,仅需在redis.conf文件中配置即可,默认配置是启用的。

在配置文件redis.conf中搜索 SNAPSHOTTING, 查找在注释开始和结束之间的关于RDB的配置说明。配SNAPSHOTTING置地方有三处。

  1. 配置执行RDB生成快照文件的时间策略,对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个key改动”这一条件被满足时, 自动保存一次数据集。

  2. 配置格式:save  <seconds>  <changes>

  3.  

    默认参数为:

    save 900 1

     

    save 300 10

    save 60 10000

  4. Redis的RDB和AOF持久化方式

  5. dbfilename:设置RDB的文件名,默认文件名为dump.rdb

  6. Redis的RDB和AOF持久化方式

  7. dir:指定RDB文件的存储位置,默认是 ./ 当前目录,表示你的redis命令在哪一级目录下启动的,该文件就在哪里存放

  8. 添加两个key

  9. 登录客户端./redis-cli -a 123456就OK了

  10. Redis的RDB和AOF持久化方式

  11. 显示保存成功

  12. Redis的RDB和AOF持久化方式

  13. 去/usr/local/redis-3.2.9/src可以看到rdb文件已经存在了

  14. Redis的RDB和AOF持久化方式

  15. 当退出redis的时候也会去保存

  16. Redis的RDB和AOF持久化方式

  17. 如果不想使用RDB方式,注释掉就行了,或者删除这几行,配置上已经说明了

  18. Redis的RDB和AOF持久化方式

  19. 在次停止就不会去保存了

  20. Redis的RDB和AOF持久化方式

  21. 总结:

    1. 优点:

      1. 由于存储的是数据快照文件,恢复数据很方便,也比较快

    2. 缺点:

      1. 会丢失最后一次快照以后更改的数据。如果你的应用能容忍一定数据的丢失,那么使用rdb是不错的选择,如果你不能容忍一定数据的丢失,使用rdb就不是一个很好的选择。

      2. 由于需要经常操作磁盘,RDB 会分出一个子进程。如果你的redis数据库很大的话,子进程占用比较多的时间,并且可能会影响 Redis 暂停服务一段时间(millisecond 级别),如果你的数据库超级大并且你的服务器CPU比较弱,有可能是会达到一秒。

(二)AOF方式

Append-only File(AOF),Redis每次接收到一条改变数据的命令时(类似MySQL的主从复制binlog,只复制DML语句),它将把该命令写到一个AOF文件中(只记录写操作,读操作不记录),当Redis重启时,它通过执行AOF文件中所有的命令来恢复数据。

       实现方式

AOF方式的数据持久化,仅需在redis.conf文件中配置即可配置项:

  1. appendonly:默认是no,改成yes即开启了aof持久化

  2. appendfilename:指定AOF文件名,默认文件名为appendonly.aof

  3. Redis的RDB和AOF持久化方式

  4. dir : 指定RDB和AOF文件存放的目录,默认是 ./,和RDB是同一个配置

  5. appendfsync:配置向aof文件写命令数据的策略:

    1. no:不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),比较快但不是很安全。

    2. always:每次执行写入都会执行同步,慢一些但是比较安全。

    3. everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。

    4. Redis的RDB和AOF持久化方式

  6. auto-aof-rewrite-min-size:允许重写的最小AOF文件大小,默认是64M 。当aof文件大于64M时,开始整理aop文件, 去掉无用的操作命令。缩小aop文件。

  7. 查看该路径下的aof文件

  8. Redis的RDB和AOF持久化方式

  9. 使用dbsize看到没有key

  10. Redis的RDB和AOF持久化方式

  11. more testappendonly.aof

  12. Redis的RDB和AOF持久化方式

  13. 看到set k1和set k2之间没有get k1,不记录查询语句

  14. 和RDB一样退出时也保存

  15. Redis的RDB和AOF持久化方式

  16. 启动reids测试持久化

  17. Redis的RDB和AOF持久化方式

  18. 重启redis

  19. Redis的RDB和AOF持久化方式

  20. Redis的RDB和AOF持久化方式

  21. 可以看到重新启动之后数据还在

  22. 总结:
    1. append-only 文件是另一个可以提供完全数据保障的方案。

    2. AOF 文件会在操作过程中变得越来越大。比如,如果你做一百次加法计算,最后你只会在数据库里面得到最终的数值,但是在你的 AOF 里面会存在 100 次记录,其中 99 条记录对最终的结果是无用的,但 Redis 支持在不影响服务的前提下在后台重构 AOF 文件,让文件得以整理变小。

    3. 可以同时使用这两种方式,redis默认优先加载aof文件(aof数据最完整)。

dir ./  该配置含义

  1. 表示./redis-server在哪级目录启动,所生成的文件就在那保存,例如:
  2. Redis的RDB和AOF持久化方式
  3. 在redis-server上一级目录启动,所生成的文件就在该级目录保存
  4. Redis的RDB和AOF持久化方式
  5. 如果你指定了dir目录路径
  6. Redis的RDB和AOF持久化方式
  7. 不管在哪一级启动redis-server,该文件都会在你指定的目录
  8. Redis的RDB和AOF持久化方式
  9. 如果aof文件在你指定的路径中
  10. Redis的RDB和AOF持久化方式
  11. 如果你启动命令所在的目录中不存在aof文件
  12. Redis的RDB和AOF持久化方式

相关文章: