彻底弄懂Redis--持久化篇

Redis缓存之所以快就是因为我们是从内存中进行读取,内存的速度要比文件的速度快得多,但是如果只是存在于内存的话,那么数据是无法被保留下来的,就像memcahe,数据只是在会话中才能用,一旦关闭连接过着出现什么问题,数据就会不见,设想一下如果购物车用memcache做缓存,那后果不堪设想,所以这就是Redis比memcache有优势的一部分,即Redis支持持久化。

Redis持久化

Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。

RDB

Redis会定期(周期性的)保存数据快照至一个rbd文件中,并在启动时自动加载rdb文件,恢复之前保存的数据。可以在配置文件中配置Redis进行快照保存的时机:

save [seconds] [changes]

意为在[seconds]秒内如果发生了[changes]次数据修改,则进行一次RDB快照保存,例如

save 60 100

会让Redis每60秒检查一次数据变更情况,如果发生了100次或以上的数据变更,则进行RDB快照保存。可以配置多条save指令,让Redis执行多级的快照保存策略。Redis默认开启RDB快照。

也可以通过BGSAVE命令手动触发RDB快照保存。

RBD的优缺点

优点
1)对性能的影响比较小,RDB在保存快照的时候,会获取fork出一个子进程,去处理这个业务,所以几乎不会影响Redis处理其它的请求
2)回复起来比AOF要快
3)方便备份,只需要移动一个文件即可
缺点
1)数据的完整性不高:快照是定期生成的,如果发生宕机等意外情况可能会丢失一部分数据。
2)如果数据集非常大的时候,子进程的消耗太大,会影响Redis处理其它请求的能力

AOF

采用AOF持久方式时,Redis会把每一个写请求都记录在一个日志文件里。在Redis重启时,会把AOF文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。AOF默认是关闭的,如要开启,进行如下配置:

appendonly yes

AOF提供了三种fsync配置,always/everysec/no,通过配置项[appendfsync]指定:

appendfsync no:不进行fsync,将flush文件的时机交给OS决定,速度最快
appendfsync always:每写入一条日志就进行一次fsync操作,数据安全性最高,但速度最慢
appendfsync everysec:折中的做法,交由后台线程每秒fsync一次

随着AOF不断地记录写操作日志,因为所有的操作都会记录,所以必定会出现一些无用的日志。大量无用的日志会让AOF文件过大,也会让数据恢复的时间过长。不过Redis提供了AOF rewrite功能,可以重写AOF文件,只保留能够把数据恢复到最新状态的最小写操作集。

AOF rewrite可以通过BGREWRITEAOF命令触发,也可以配置Redis定期自动进行:

auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb

上面两行配置的含义是,Redis在每次AOF rewrite时,会记录完成rewrite后的AOF日志大小,当AOF日志大小在该基础上增长了100%后,自动进行AOF rewrite。同时如果增长的大小没有达到64mb,则不会进行rewrite。

AOF的优缺点

优点
1)安全性高,就算是启用了每秒写入,也只是丢失这一秒的数据
2)保证数据的完整性,即使写入一半,也可以使用redis-check-aof工具轻松修复。
3)AOF文件易读,可修改,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。

缺点:
1)AOF的文件比RDB文件大
2)性能消耗大
3)AOF恢复起来比RDB困难

数据持久化引发的延迟

Redis的数据持久化工作本身就会带来延迟,需要根据数据的安全级别和性能要求制定合理的持久化策略:

1)AOF + fsync always的设置虽然能够绝对确保数据安全,但每个操作都会触发一次fsync,会对Redis的性能有比较明显的影响
2)AOF + fsync every second是比较好的折中方案,每秒fsync一次
3)AOF + fsync never会提供AOF持久化方案下的最优性能
4)使用RDB持久化通常会提供比使用AOF更高的性能,但需要注意RDB的策略配置
5)每一次RDB快照和AOF Rewrite都需要Redis主进程进行fork操作。fork操作本身可能会产生较高的耗时,与CPU和Redis占用的内存大小有关。根据具体的情况合理配置RDB快照和AOF Rewrite时机,避免过于频繁的fork带来的延迟

关于使用,为了保证数据的持久化,建议至少要开启RDB,其他的可以根据的自己的需求,及其服务器的性能进行设置。

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88818173