一、持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘上,那么一旦服务器进程退出,或者突然宕机,那服务器中的数据库状态也会消失,为了使服务器即使突然关机也能保存数据,必须通过持久化的方式将数据从内存保存到磁盘中。
(一)Redis的持久化机制
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:。
RDB:
RDB持久化过程:
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,在磁盘中对应产生的数据文件为 dump.rdb。可以通过配置文件中的save参数来定义快照的周期。
redis.config配置文件中的save参数,按第一个来说,就是如果在900s内改变了至少一个key,那就会保存到磁盘。
如何触发rdb?
1.满足save条件的时候,会自动触发rdb规则。
2…执行 flushall 命令,也会触发rdb规则。
3.退出redis,也会产生 rdb 文件。
如何从磁盘中恢复数据?
只要在目录中存在dump.rdb文件,redis启动的时候会自动检查dump.rdb并自动恢复其中的数据,将rdb文件直接读到内存里。
优点:
- Redis会单独创建(fork)一个子进程来进行持久,让主进程继续处理命令。在子线程持久化期间,主进程是不进行任何IO操作的,这就确保了极高的性能。
- 适合大规模的数据恢复!
缺点:
- 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化期间redis 发生故障意外宕机,会造成数据丢失。所以这种方式更适合数据要求不严谨的时候。
- fork进程的时候,会占用一定的内容空间。
AOF (Append Only File):
AOF持久化是将Redis执行的每次写命令记录到单独的日志文件中(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF持久化在磁盘中的数据文件为appendonly.aof 文件。
工作流程:
aof 默认是文件的无限追加(每次写操作都会记录),appendonly.aof文件会越来越大。如果 aof 文件大于 64m,太大了!会 fork一个新的进程来将文件进行重写!
如何开启AOF机制?
只需要把redis.config配置文件中中的appendonly改为yes,然后重启redis即可!
因为AOF不允许修改文件,如果不小心把.aop文件修改了,那这个时候 redis 是启动不起来的,我们需要利用redis提供的一个工具 redis-check-aof --fix进行修复。
修复完成后重新连接redis即可。
优点:
appendfsync always # 每次修改都会 sync。消耗性能
appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据!
appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快!
- 数据安全,aof 持久化可以配置 appendfsync 属性,当配置 always时,每进行一次命令操作就记录到 aof 文件中一次。
- 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
- AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点: