zoukankan      html  css  js  c++  java
  • Redis(六)

    Redis的持久化

    Redis 为什么要持久化?

    Redis 中的数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 Memcached 一样,为了保证效率,数据都是缓存在内存中。

    对,数据都是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据都会消失殆尽,再也找不回来了。所以,为了让数据能够长期保存,就要将 Redis 放在缓存中的数据做持久化存储。

    Redis提供了2种不同形式的持久化方式

    RDB(Redis Database)

    AOF (Append Of File)

    RDB

    在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复是将快照文件直接读到内存里。

    备份如何执行的

    Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换

    到上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据恢复操作,且对于

    数据恢复的完整性不是很敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失(正常退出如shutdown会完整保存)。

    关于fork

    在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会被exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”(需要写的时候再复制),

    一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

    RDB的保存文件

    在redis.conf中配置文件名称,默认为dump.rdb

    dbfilename dump.rdb

    rdb文件的保存路径,也可以修改,默认为./,也就启动redis的当前路径下

    dir ./

    rdb的保存策略

    save seconds changes 多少秒之内完成对数据库的多少次更改之后就会持久化

    save 900 1 在900秒完成一次对数据库的更改就会进行持久化

    命令save

    只管保存,其他不管,对Redis的所有操作全都阻塞

    stop-writes-on-bgsave-error yes

    当Redis无法写入磁盘的话,直接关掉Redis的写操作。

    rdbcompression yes

    进行rdb保存时,将文件压缩

    rdbchecksum yes

    在存储快照后,还可以将Redis用CRC64算法来进行数据的校验,以检查数据是否准确,但这样会增加大约10%的性能消耗,如果希望获取到最大性能,可以关闭此功能

    rdb的备份

    先通过config get dir 查询rbd文件的目录

    将*.rbd的文件拷贝到别的地方

    rdb的恢复

    关闭Redis

    先把备份的文件拷贝到工作目录下

    启动Redis,备份文件会直接加载

    rdb的优点:

    节省磁盘空间

    恢复速度快

    rdb的缺点:

    虽然使用了写时拷贝技术,但数据太大时还是会消耗性能

    备份周期在一定间隔时间做一次备份,如果Redis意外down掉,就会丢失最后一次快照后的所有修改,就是我之前所说的RDB的缺点是最后一次持久化后的数据可能丢失

    rdb与aof

    rdb保存的数据,aof保存的指令

    AOF

    以日志的形式来记录每个写操作,通过执行日志文件的指令完成数据恢复工作

    AOF默认不开启,需要手动在配置文件中配置

    appendonly no

    可以在redis.conf中配置文件名称,默认为appendonly.aof

    appendfilename "appendonly.aof"

    AOF文件的保存路径,同rdb文件一致

    dir ./ #这个配置对rdb有用,对aof也有用#

    aof和rdb同时开启,Redis会听谁的?

    以AOF为准

    AOF文件故障备份

    AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载

    AOF和RDB同时开启,系统默认取AOF的数据

    AOF文件故障恢复

    AOF文件的保存路径与RDB文件的保存路径一致

    如遇到AOF文件损坏,可通过

    redis-check-aof --fix appendonly.aof 进行恢复(基本没啥屌用)

    AOF同步频率设置

    始终同步,每次Redis的写入都会立刻记入日志

    每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失

    不主动进行同步,把同步时机交给OS(操作系统)

    appendfsync always 始终同步

    appendfsync everysec 每秒同步

    appendfsync no 不主动进行同步

    Rewrite

    AOF采用文件追加方式,由于指令的增多,文件会越来越大,为避免出现此种情况,新增重写机制,当AOF文件大小超过所设定的阈值时

    Redis就会启动AOF文件的内容压缩,只保留可恢复数据的最小指令集,可以使用命令bgrewriteaof

     

    AOF优点

    备份机制更稳定,丢失数据概率低

    可读的日志文本,通过操作AOF,可以处理误操作,比如flushdb就是写指令

    AOF的缺点

    比RDB占用更多的磁盘空间

    恢复备份速度更慢

    每次读写都同步的话,有一定性能压力

    存在个别BUG,可能会造成不恢复

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/qyx66/p/12207793.html
Copyright © 2011-2022 走看看