Redis-持久化策略
-
持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据存在内存中,电脑关闭或者重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。
-
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。
-
redis提供两种方式进行持久化
- RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上)
- AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)。
1.RDB方式
A、什么是RDB方式?
-
RedisDatabase(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读取到内存。
-
RDB保存了某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。
默认是dump.rdb。 -
RDB技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响Redis的正常使用。
-
RDB恢复数据时比其他AOF速度快
rdb相当于数据的快照
B、如何实现
- RDB方式的数据持久化,仅需要在redis.conf文件中配置即可,默认配置是启用的
- 在配置文件redis.conf中搜索SNAPSHOTTING,查找在注释开始和结束之间关于RDB的配置说明
- 配置SNAPSHOTTING地方共三处
-
配置进行RDB生成快照文件的时间策略。
对redis进行设置,让它在“N秒内数据集至少有M个key改动”这一条件被满足时,自动保存一次数据集
配置格式:save <seconds><changes>save 900 1 save 300 10 save 60 10000
-
dbfilename:
设置RDB的文件名,默认文件名是dump.rdb -
dir:指定RDB文件的存储位置,默认是./当前目录
2.AOF方式
A、什么是AOF方式
-
Append-onlyFile(AOF), Redis每次接收到一条改变数据的命令时,它将把 该命令(语句) 写到一个AOF文件中
(只记录写操作,读操作不记录) -
当redis重启时,它通过执行AOF文件中所有的命令来恢复数据
aof相当于日志记录操作命令
B、如何实现
- AOF方式的持久化,仅需在redis.conf文件中配置即可
- 配置项
- appendonly:默认是no,改成yes即开启了aof持久化
- appendfilename:指定AOF文件名,默认是appendonly.aof
- dir:指定RDB和AOF文件存放的目录,默认是./
- appendfsync:配置向aof文件写命令数据的策略:
1. no:不主动进行同步操作,而是完全交由操作系统来做(每30秒一次),比较块但是不是很安全
2. always:每次执行写入都会执行同步操作,慢一些但是比较安全
3. everysec:每秒执行一此同步操作,比较平衡,介于速度和安全之间。这是默认项
RDB与AOF各自的优缺点
RDB的优点:
- 由于存储的是数据快照文件,恢复数据很方便,也比较快,适合做备份
rdb是redis性能最大化的体现,它不用每秒监控是否有数据写入,当达到触发条件后就自动fork一个子进程进行全量更新,速度也很快。容灾恢复方面rdb更是能够快速的恢复数据,而aof需要读取再写入,相对慢了很多。
RDB的缺点:
- 会丢失最后一次快照以后更改的数据。 如果你的应用能容忍一定的数据丢失,那么使用rdb是个不错的选择;
- 由于需要经常操作磁盘,RDB会分出一个子进程。如果你的redis数据库很大的话,子进程占用比较多的时间,并且可能会影响Redis暂停服务一段时间(millisecond级别),如果你的数据库超级大并且服务器CPU比较弱,有可能会达到一秒。耐久性差: 相对aof的异步策略来说,因为rdb的复制是全量的,即使是fork的子进程来进行备份,当数据量很大的时候对磁盘的消耗也是不可忽视的,尤其在访问量很高的时候,fork的时间也会延长,导致cpu吃紧,耐久性相对较差。
AOF的优点:
- 数据保证(安全性): 我们可以设置fsync策略,一般默认是everysec,也可以设置每次写入追加,所以即使服务死掉了,咱们也最多丢失一秒数据。
安全性来讲由于aof的记录能够精确到秒级追加甚至逐条追加,而rdb只能是全量复制,aof明显高于rdb。 - 自动缩小: 当aof文件大小到达一定程度的时候,后台会自动的去执行aof重写,此过程不会影响主进程,重写完成后,新的写入将会写到新的aof中,旧的就会被删除掉。
AOF的缺点:
-
性能相对较差:它的操作模式决定了它会对redis的性能有所损耗
-
恢复速度更慢: 容灾恢复方面rdb更是能够快速的恢复数据,而 aof需要读取再写入 ,相对慢了很多。
-
体积相对更大:尽管是将aof文件重写了,但是毕竟是操作过程和操作结果仍然有很大的差别,体积也毋庸置疑的更大。