Redis是基于内存的数据库,如果出现了断电或者故障,将会导致全部数据的丢失,Redis提供了两种持久化策略。
RDB持久化可以手动执行
,也可以通过配置文件配置的信息定期执行
。
Redis允许用户在配置文件中自定义配置规则
所有的条件是"或关系",例如第一条的意思是900秒内有一个或一个以上的键被更改则执行快照。
当我们需要对服务器进行重启、备份、迁移等操作时也会需要手动进行备份操作。
save命令会使Redis同步
的执行快照操作,在进行快照的过程中会阻塞
所有客户端的请求,当备份较多数据时会导致Redis在很长一段时间中不响应。
只要快照的执行条件不为空,则Redis会进行一次快照操作,然后清空Redis数据库中的所有数据,如果没有快照条件则直接清空。
bgsave命令还可以在后台异步
的执行快照操作,执行快照的同时,Redis还可以响应客户端的请求。
步骤:
同一内存数据
,当主进程需要进行更改某片诗句时,会将该片数据复制一份,保证修改时子进程的快照不受影响。写时复制策略保证了在fork时内存的占用量不会增加一倍,但是如果在快照时,客户端传来大量的更改请求也有可能导致内存溢出)save为同步进程
,bgsave为异步进程
。各有优劣,在Redis存储的数据量只有几个GB的时候,使用bgsave是没有问题的,但是随着Redis占用的内存越来越多,bgsave在创建子进程耗费的时间也会越来越长,并且和主进程抢占资源,导致Redis性能低下无法使用,此时save执行的速度将会远快于bgsave,例如可以选择写一个脚本在凌晨进行save保存,对应用程序的影响较小。
通过RDB方式持久化,一旦Redis异常退出,所丢失的就是最后一次快照后所修改的数据。RDB快照文件是经过压缩的,所以它占用的空间会小于内存中的数据大小,更有利于传输。
AOF方式是将Redis执行的每一条命令都追加到硬盘文件中,会稍微影响Redis的性能,使用SSD可以提高AOF的性能。
当Redis每执行一条命令时,AOF机制都会将命令追加进硬盘文件中,但是由于操作系统的缓存机制,数据并没有真正的被写到磁盘,而是进入了系统硬盘的缓冲区
中,默认情况下系统每30秒执行一次同步
操作,此时才真正将内容写入了磁盘,但是在这30秒内系统出现异常退出将会导致缓存中的数据丢失,Redis在配置文件中提供了如下策略:
那么问题来了 如果执行了三条命令如下:
set name 1
set name 2
set name 3
Redis会将这三条命令全部写入AOF文件中,但是前两条命令都会被第三条覆盖,所以前两条是冗余命令,随着命令越来越多,AOF文件也会越来越大,而Redis中可能并没有多少数据。Redis对此问题有专门的优化机制。每达到一定条件时Redis会自动重写
AOF文件,这些条件可以在配置文件中自定义。
auto-aof-rewrite-percentage 100 表示当前的AOF文件超过上一次重写时的AOF文件大小百分之100时会再次重写 auto-aof-rewrite-min-size 64mb 限制了重写的最小AOF文件大小
AOF重写的原理:
AOF重写不需要对现有的AOF文件进行读取分析,而是直接通过读取当前数据库的数据来实现的。通俗点说就是读取了数据库的数据,生成所有set他们的命令,类似于导出sql文件。
AOF重写具体步骤:
一致
,设置了一个AOF重写缓冲区
,在重写过程中的新的写请求都会复制一份到缓冲区中。(图片来自:https://segmentfault.com/a/1190000016951866#articleHeader6)
手动执行bgrewriteaof命令进行AOF重写。
AOF的重写与bgsave十分相似,都需要启动一个子线程,在AOF文件庞大时,子线程也会与主线程抢占资源,出现性能问题,所以需要进行上述的配置,用以控制AOF文件的体积大小,过于频繁的回收会影响系统性能,反之会导致AOF文件体积过大,需要在实际使用中进行调试。
已经过期就不会存入RDB文件中
。Redis中他们俩不排斥,可以同时使用。如果服务器中同时开了RDB和AOF持久化,那么服务器优先使用AOF文件来还原数据。
RDB:
优点:载入时恢复数据块,备份文件体积小
缺点:在持久化后到下一次持久化之间的数据会丢失。
AOF:
优点:丢失数据较少,默认下只丢失一秒的数据
缺点:恢复数据时比较慢,文件体积大。