redis持久化

  redis是一个内存数据库,为了保证数据的持久性,它提供了三种持久化方式:RDB、AOF、混合持久化模式(4.0增加,5.0默认开启)

一、RDB

  RDB是redis默认采用的持久化方式,其是通过快照完成的,当符合一定的条件时,redis会自动将内存中的数据进行快照并持久化到硬盘。

  1、触发RDB快照的时机:

    符合指定配置的快照规则

    执行save或bgsave命令

    执行flushall

    执行主从复制操作

  2、设置快照规则及配置

    save 多少秒内   数据变了多少

    save "":不使用RDB存储

#15分钟内至少有一个键被更改则进行快照
save 900 1
#5分钟内至少有10个键被更改则进行快照
save 300 10
#1分钟内至少有10000个键被更改则进行快照
save 60 10000
#rdb文件名
dbfilename dump.rdb
#rdb快照文件存放路径
dir ./

  3、RDB快照的实现原理及过程

  (1)redis调用系统中的fork函数复制一份当前进程的副本

  (2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入磁盘中的临时文件

  (3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

  4、RDB的优缺点

    缺点:使用RDB方式实现持久化,一旦redis异常退出,则会丢失最后一次快照之后的数据。

    优点:RDB可以最大化redis的性能,父进程在北村RDB文件时唯一要做的就是fork出来一个子进程,然后由子进程来处理接下来的保存工作,父进程无需执行任何IO操作,同时这也是一个缺点,如果数据集比较大时,fork可能也比较耗时,可能会造成服务器在一段时间内停止处理客户端请求。

二、AOF

  默认情况下redis是没有开启AOF方式的持久化。

  开启持久化后,每执行一条更改redis中数据的命令,redis就会将该命令写入磁盘中的AOF文件,这一过程会降低Redis的性能,但大部分情况下这个影响是可以接受的,另外使用较快的磁盘也可以提高AOF的性能。

#开启aof
appendonly yes
#设置aof文件名称
appendfilename "appendonly.aof"
#文件存储路径 RDB和AOF使用的同一个目录参数
dir ./

  redis在每一次该更数据的时候, aof机制都会将数据记录到aof文件中,但实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入了硬盘缓存,再通过硬盘缓存机制去刷新并保存到文件中。

# 每次执行写入都会进行同步,这个是最安全但是又是效率最低的方式
# appendfsync always
# 每一秒执行一次(默认)
appendfsync everysec
# 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
# appendfsync no

  AOF重写原理(优化AOF文件)

  redis可以在AOF文件体积变得过大时,自动的在后台对AOF进行重写,重写后的AOF文件包含了回复当前数据集所需的最小命令集合。例如对同一个key做了多次赋值,那么只保留最后一次赋值操作等。

三、如何选择RDB和AOF

  如果是作为数据库,则需要使用 RDB + AOF,这样数据极少会丢失

  如果是缓存服务器,则只需要开启RDB

  不建议只使用AOF(性能差)

  进行数据恢复时,先恢复RDB再回复AOF

  如何选择RDB和AOF是redis4.0之前需要考虑的,在redis4.0之后,redis提供了混合持久化方式。

四、混合持久化方式

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

  查询是否开启混合模式可以使用config get aof-use-rdb-preamble命令

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

  如果出现yes表示已开启混合持久化,no表示关闭,redis5.0默认开启,如果是其他版本则需要检查一下,如果是关闭的,可以使用命令行开启或通过修改redis配置文件开启两种方式。

 (1)通过命令开启

config set aof-use-rdb-preamble yes

 (2)通过修改redis配置文件开启

aof-use-rdb-preamble yes

  如果通过命令开启,如果重启redis就会失效;如果通过修改redis配置文件变更,需要重启redis才能生效。

------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
原文地址:https://www.cnblogs.com/liconglong/p/14322527.html