redis 持久化
redis提供了不同级别的持久化方式:一种是RDB,一种是AOF
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。Redis还可以在后台对AOF文件进行重写(rewrite),使得AOF文件的体积不会超出保存数据集状态所需的实际大小。
redis还可以同时使用AOF持久化和RDB持久化。在这种情况下,当redis重启时,他会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。只有当AOF持久化功能处于关闭状态时,服务器才会使用RDB文件还原数据库状态
RDB持久化
RDB持久化是将内存中的数据库状态保存到硬盘上,可以手动执行也可以在redis.conf中配置,定期执行
数据库状态是指非空数据库及数据库中的键值对
RDB持久化所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成的RDB文件时的数据库状态
RDB文件的创建与载入
有两个命令可以用于生成RDB文件:
- SAVE : SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
- BGSAVE : 派生一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。(此时会拒绝客户端发送的save和bgsave)
注意:BGSAVE与BGREWRITEAOF不能同时执行
- 如果BGSAVE正在执行,客户端发送的BGREWRITEAOF会被延迟到BGSAVE命令执行完毕之后执行
- 如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝
RDB文件的载入是由服务器启动时自动执行的,没有专门用于载入RDB文件的命令,如图
配置redis.conf
################################ 快照 #################################
- #
- # Save the DB on disk:保存数据库到磁盘
- #
- # save <秒> <更新>
- #
- # 如果指定的秒数和数据库写操作次数都满足了就将数据库保存。
- #
- # 下面是保存操作的实例:
- # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
- # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
- # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
- #
- # 注释:注释掉“save”这一行配置项就可以让保存数据库功能失效。
- #
- # 你也可以通过增加一个只有一个空字符串的配置项(如下面的实例)来去掉前面的“save”配置。
- #
- # save ""
- save 900 1
- save 300 10
- save 60 10000
- # 900秒内至少修改1次 300秒至少修改10次 60秒至少10000次
- #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。
- #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。
- #
- #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。
- #
- #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。
- #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。
- stop-writes-on-bgsave-error yes
- #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象?
- #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。
- #如果你想在存储的子进程中节省一些CPU就设置成'no',
- #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。
- rdbcompression yes
- #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。
- #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,
- #所以,为了达到性能的最大化,你可以关掉这个配置项。
- #
- #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。
- rdbchecksum yes
- # 导出数据库的文件名称
- dbfilename dump.rdb
- # 工作目录
- #
- # 导出的数据库会被写入这个目录,文件名就是上面'dbfilename'配置项指定的文件名。
- #
- # 只增的文件也会在这个目录创建(这句话没看明白)
- #
- # 注意你一定要在这个配置一个工作目录,而不是文件名称。
- dir /opt/redis-2.6.10/data
AOF持久化
AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态的
AOF配置
AOF持久化,默认是关闭的,默认是打开RDB持久化
appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓
AOF,append only file。
appendonly no
配置文件中的appendonly修改为yes。开启AOF持久化后,你所执行的每一条指令,都会被记录到appendonly.aof文件中。但事实上,并不会立即将命令写入到硬盘文件中,而是写入到硬盘缓存,在接下来的策略中,配置多久来从硬盘缓存写入到硬盘文件。所以在一定程度一定条件下,还是会有数据丢失,不过你可以大大减少数据损失。
AOF保存模式
#appendfsync always
appendfsync everysec
#appendfsync no
这里是配置AOF持久化的策略。redis默认使用everysec,就是说每秒持久化一次,而always则是每次操作都会立即写入aof文件中。而no则是不主动进行同步操作,是默认30s一次。当然always一定是效率最低的,个人认为everysec就够用了,数据安全性能又高。
Redis也允许我们同时使用两种方式,再重启redis后会从aof中恢复数据,因为aof比rdb数据损失小。
模式 | WRITE 是否阻塞? | SAVE 是否阻塞? | 停机时丢失的数据量 |
AOF_FSYNC_NO | 阻塞 | 阻塞 | 操作系统最后一次对 AOF 文件触发 SAVE 操作之后的数据。 |
AOF_FSYNC_EVERYSEC | 阻塞 | 不阻塞 | 一般情况下不超过 2 秒钟的数据。 |
AOF_FSYNC_ALWAYS | 阻塞 | 阻塞 | 最多只丢失一个命令的数据。 |
AOF重写