持久化概念: 可以将数据写入到磁盘中,在服务器出现停机或者宕机;再次启动redis时,会将磁盘中的备份数据加载到内存中恢复使用
redis中有两种持久化的机制:
1、RDB(快照)
1.1、实现原理
redis是由C语言实现的,fork函数会把主线程复制一个子线程,子线程会把内存的数据依次遍历出来,存放到指定的二进制文件当中:dump.rdb
1.2、配置快照持久化
redis中的快照持久化默认是开启的,在redis.conf配置文件中有相关的配置选项
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1 #900秒内至少有1个key被更改就执行快照
save 300 10 #300内描述至少有10个key被更改就执行快照
save 60 10000 #60秒内至少有10000个key被更改就执行快照
# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes #拍摄快照失败是否继续执行写命令
# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes #是否对快照文件进行压缩
# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
# This makes the format more resistant to corruption but there is a performance
# hit to pay (around 10%) when saving and loading RDB files, so you can disable it
# for maximum performances.
#
# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check.
rdbchecksum yes #是否进行数据校验
# The filename where to dump the DB
dbfilename dump.rdb #快照文件存储的名称
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./ #快照文件存储的位置
1.3、验证快照效果
-
进入安装目录,如果有dump.rdb文件就删除
-
启动redis,然后添加几个数据,然后关闭redis并退出。如下
-
在我们的安装目录下有生成了一个dump.rdb文件,这个就是我们的快照备份文件。
-
再次启动redis,进入发现原来的数据还在,这是因为redis启动的时候加载了备份文件中的数据。
-
关闭退出,关闭退出后删除dump.rdb文件,启动后发现数据没有了
1.4、快照持久化原理
1.4.1、save命令
在redis运行中,我们可以显示的发送一条save命令来拍摄快照。save命令是阻塞命令,也就是当服务器接收了一条save命令之后就会开始拍摄快照,在此期间不会再去处理其他的请求,其他请求会被挂起直到备份结束。
1.4.2、bgsave命令
bgsave命令也是立即拍摄快照,有别于save命令,bgsave并不是一条阻塞命令,而是fork一个子线程,然后这个子线程负责备份操作。而父进程继续处理客户端的请求,这样就不会造成阻塞了。
1.4.3、根据配置文件默认快照
1.4.4、shutdown命令
当我们只想shutdown命令的时候。服务器会自动发送一条save命令来完成快照操作。并在完成备份操作后关闭服务器。所以我们当我们的操作不满足前面三种情况的时候关闭服务器后,再次打开我们的数据也不会丢失。
1.4.5、sync命令
当在主从环境中,从节点要同步主节点的数据的时候会发送一条sync命令来开发一次复制。此时主节点会发送一条bgsave命令来fork一个新的线程来完成快照并在bgsave命令操作结束后将快照文件发送给从节点来完成主从节点的数据的同步。
1.5、优缺点
1.5.1、优点
- RDB文件是一个很简洁的单文件,它保存了某个时间点的Redis数据,很适合用于做备份。你可以设定一个时间点对RDB文件进行归档,这样就能在需要的时候很轻易的把数据恢复到不同的版本。
- RDB很适合用于灾备。单文件很方便就能传输到远程的服务器上。
- RDB的性能很好,需要进行持久化时,主进程会fork一个子进程出来,然后把持久化的工作交给子进程,自己不会有相关的I/O操作。
- 比起AOF,在数据量比较大的情况下,RDB的启动速度更快。
1.5.2、缺点
- RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照到Redis出现问题这段时间的数据就会丢失了。
- RDB使用fork()产生子进程进行数据的持久化,如果数据比较大的话可能就会花费点时间,造成Redis停止服务几毫秒。如果数据量很大且CPU性能不是很好的时候,停止服务的时间甚至会到1秒。
1.6、如何禁用快照持久化
- 在redis.conf配置文件中注释掉所有的save配置
- 在最后一条save配置追加吃命令
2、AOF(append only file)
2.1、实现原理
redis可以将执行的 ‘所有指令’ 追加到文件中持久化
2.2、实现方式
默认没有开启只需要更改配置文件
- appendonly yes # 是否开启AOF
- appendfilename “appendonly.aof” # AOF文件
2.3、 优点
- 使用起来简单,只要修改配置文件, 日志文件是单独文件
- 可以修改日志文件得大小:BGREWRITERAOF
- 使用AOF机制的缺点是随着时间的流逝,AOF文件会变得很大。但redis可以压缩AOF文件。
2.4、缺点
- 文件大小有限制
- 读取速度比RBD要慢
2.5、写入时机
- appendfsync always:把每个写命令都立即同步到aof,很慢,但是很安全
- appendfsync everysec:每秒同步一次,是折中方案
- appendfsync no:redis不处理交给OS来处理,非常快,但是也最不安全
redis允许我们同时使用两种机制,通常情况下我们会设置AOF机制为everysec 每秒写入,则最坏仅会丢失一秒内的数据。