zoukankan      html  css  js  c++  java
  • 《Redis核心原理与实战》学习笔记2——Redis持久化

    一、概念

    Redis的读写都是在内存中,所以它的性能较高。但内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,因此需要将内存中的数据存储到磁盘,以便Redis重启时能够从磁盘中恢复原有数据,Redis内存数据保存到磁盘的这个过程就叫做Redis持久化。

    二、持久化的方式

    1、快照方式(RDB)

    RDB,Redis DataBase,将某一个时刻的内存数据,以二进制的方式写入磁盘。

    2、文件追加方式(AOF)

    AOF,Append Only File,记录所有的操作命令,并以文本的形式追加到文件中。

    3、混合持久化方式

    Redis 4.0 之后新增的方式,混合持久化是结合了RDB 和AOF的优点,在写入的时候,先把当前的数据以RDB的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证Redis重启时的速度,又能减低数据丢失的风险。

    三、RDB

    1、触发方式

    RDB的持久化触发方式有两类:

    (1)手动触发

    手动触发持久化的操作有两个:save和bgsave,它们主要区别体现在:是否阻塞Redis主线程的执行。

    save命令:
    在客户端中执行 save 命令,就会触发Redis的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。

    bgsave命令:
    bgsave(background save)即后台保存的意思,它和 save命令最大的区别是:bgsave会fork()一个子进程来执行持久化,整个过程中只有在fork()子进程时有短暂的阻塞,当子进程被创建之后,Redis的主进程就可以响应其他客户端的请求了。
    相对于整个流程都阻塞的save命令来说,bgsave命令更适合使用。

    (2)自动触发

    1)save m n
    是指在m秒内,如果有n个键发生改变,则自动触发持久化。 参数m和n可以在Redis的配置文件中找到,例如,save 60 1 表明在60秒内,至少有一个键发生改变,就会触发RDB持久化。 自动触发持久化,本质是Redis通过判断,如果满足设置的触发条件,自动执行一次 bgsave命令。
    注意:当设置多个save m n命令时,满足任意一个条件都会触发持久化。

    2)flushall
    用于清空Redis数据库,在生产环境下一定慎用,当Redis执行了flushall命令后,会触发自动持久化,把RDB文件清空。

    3)主从同步触发
    在Redis主从复制中,当从节点执行全量复制操作时,主节点会执行bgsave命令,并将RDB文件发送给从节点,该过程会自动触发Redis持久化。

    2、数据恢复

    当Redis服务器启动时,如果Redis根目录存在RDB文件dump.rdb,Redis就会自动加载RDB文件恢复持久化数据。

    3、RDB的优缺点

    (1)优点

    RDB的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;
    RDB对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行Redis服务恢复;

    RDB可以更大程度的提高Redis的运行速度,因为每次持久化时Redis主进程都会fork()一个子进程,进行数据持久化到磁盘,Redis主进程并不会执行磁盘I/O等操作;

    与AOF 格式的文件相比,RDB 文件可以更快的重启。

    (2)缺点

    因为RDB只能保存某个时间间隔的数据,如果中途Redis服务被意外终止了,则会丢失一段时间内的Redis数据;

    RDB需要经常 fork()才能使用子进程将其持久化在磁盘上。如果数据集很大,fork()可能很耗时,并且如果数据集很大且CPU性能不佳,则可能导致Redis停止为客户端服务几毫秒甚至一秒钟。

    四、AOF

    1、AOF持久化状态查询

    Redis默认是关闭AOF持久化,使用config get appendonly命令,可以查询AOF的启动状态。

    127.0.0.1:6379> config get appendonly
    1) "appendonly"
    2) "no"
    

    第一行为AOF文件的名称,第二行表示AOF启动的状态,yes表示已启动,no表示未启动。

    2、开启AOF持久化

    (1)使用命令开启

    config set appendonly yes
    

    使用命令行启动的优点是Redis无需重启,缺点是一旦Redis重启,则之前使用命令行设置的配置就会失效。

    (2)在redis.conf文件中设置
    redis-cli连接后,输入info,可以看到:

    config_file:/usr/local/etc/redis.conf
    

    将该文件中的appendonly no改为appendonly yes即可。

    修改配置文件的优点是无论重启多少次Redis服务,配置文件中设置的配置信息都不会失效,缺点是每次修改配置文件都要重启Redis服务才能生效。

    3、触发方式

    (1)自动触发

    AOF持久化的自动触发有两种情况:
    1、满足 AOF 设置的策略触发
    在redis.conf中可修改appendfsync的配置信息,其中:

    always:每条 Redis 操作命令都会写入磁盘,最多丢失一条数据;
    everysec:每秒钟写入一次磁盘,最多丢失一秒的数据;
    no:不设置写入磁盘的规则,根据当前操作系统来决定何时写入磁盘,Linux默认30s写入一次数据至磁盘。

    2、满足 AOF 重写触发

    (2)手动触发

    使用命令bgrewriteaof手动触发AOF持久化。

    4、数据恢复

    正常情况下,只要开启了AOF持久化,并且提供了正常的appendonly.aof文件,在Redis启动时就会自定加载AOF文件并启动。

    5、AOF的优缺点

    (1)优点

    AOF持久化保存的数据更加完整,AOF提供了三种保存策略:每次操作保存、每秒钟保存一次、跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考虑是一个不错的选择,也是AOF默认的策略,即使发生了意外情况,最多只会丢失1秒的数据;

    AOF采用的是命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些意外原因,导致最后操作的持久化数据写入了一半,也可以通过redis-check-aof工具轻松的修复;

    AOF持久化文件非常容易理解和解析,它是把所有Redis键值操作命令,以文件的方式存入了磁盘。即使不小心使用flushall命令删除了所有键值信息,只要使用AOF文件,删除最后的 flushall命令,重启Redis即可恢复之前误删的数据。

    (2)缺点

    对于相同的数据集来说,AOF文件要大于RDB文件;

    在Redis负载比较高的情况下,RDB性能更好。

    6、持久化文件加载规则

    • 如果只开启了AOF持久化,Redis启动时只会加载AOF文件(appendonly.aof),进行数据恢复;
    • 如果只开启了RDB持久化,Redis启动时只会加载RDB文件(dump.rdb),进行数据恢复;
    • 如果同时开启了RDB和AOF持久化,Redis启动时只会加载AOF文件(appendonly.aof),进行数据恢复。

    五、混合持久化

    RDB和AOF 持久化各有利弊,RDB可能会导致一定时间内的数据丢失,而AOF由于文件较大则会影响Redis的启动速度,为了能同时使用RDB和AOF各种的优点,Redis 4.0之后新增了混合持久化的方式。

    开启混合持久化后,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式追加到文件的末尾。

    1、混合持久化状态查询

    使用config get aof-use-rdb-preamble命令可以查询混合持久化是否开启,yes代表开启,no代表关闭。

    127.0.0.1:6379> config get aof-use-rdb-preamble
    1) "aof-use-rdb-preamble"
    2) "yes"
    

    2、混合持久化的开启

    (1)使用命令开启

    config set aof-use-rdb-preamble yes
    

    (2)在redis.conf文件中设置
    将该文件中的aof-use-rdb-preamble no 改为 aof-use-rdb-preamble yes即可。

    3、数据恢复

    混合持久化的数据恢复和AOF持久化过程一样,只需要把appendonly.aof放到Redis的根目录,Redis启动时,只要开启了AOF持久化,Redis就会自动加载并恢复数据。

    4、混合持久化的优缺点

    (1)优点

    混合持久化结合了RDB和AOF持久化的优点,开头为RDB的格式,使得Redis可以更快的启动,同时结合AOF的优点,又减低了大量数据丢失的风险。

    (2)缺点

    兼容性差,如果开启混合持久化,那么此混合持久化AOF文件,就不能用在Redis 4.0之前版本了;

    AOF文件中添加了RDB格式的内容,使得AOF文件的可读性变得很差。

    六、Redis持久化最佳实践

    1、控制持久化开关

    根据实际的业务情况出发,在对数据的丢失不敏感的情况下,可考虑关闭Redis的持久化,这样所有的键值操作都在内存中,可以保证最高效率的运行Redis。

    持久化关闭操作:
    关闭 RDB 持久化,使用命令: config set save ""
    关闭 AOF 和 混合持久化,使用命令: config set appendonly no

    2、主从部署

    使用主从部署,一台用于响应主业务,一台用于数据持久化,这样就能让Redis更加高效的运行。

    3、使用混合持久化

    混合持久化结合了RDB和AOF的优点,Redis 5.0版本开始默认是开启的。

    4、使用配置更高的机器

    Redis对CPU的要求不高,反而是对内存和磁盘的要求很高,因为Redis大部分时候都在做读写操作,使用更大内存和更快的磁盘,对Redis性能的提高有帮助。

  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/luckyliulin/p/13547954.html
Copyright © 2011-2022 走看看