Redis,工具 redis持久化 发表于 2019-01-04 浏览量 40 没有评论 Redis是一个强大的消息中间件,缓存中间件,在大多数的网站都用到Redis提升网站的响应速度、并发能力、及可用性等。但是服务的可用性并不能达到100%,假如Redis宕机该如何恢复数据,Redis提供了2种持久化方法:RDB快照及AOF日志操作。一下内容是两种方式的原理及不同的业务场景该如何选择哪种方法。 ### 持久化 简单的理解,所谓的持久化就是在redis宕机恢复时能快速恢复数据,保证不会因为redis异常导致数据丢失。 ### RDB RDB是将当前进程中的数据生成快照保存到硬盘,保存的文件后缀:rdb,当redis重新启动时通过读取快照文件快速恢复数据。 #### 触发方式 - 手动触发 - 自动触发 ##### 手动触发 手动执行触发命令:save / bgsave,这2个命令都能生成rdb文件,但是二者之间是有区别的。save命令执行会发生阻塞,期间redis不能执行任何命令,直至快照生成完成;bgsave命令则会fork一个子进程,由子进程单独处理,而主进程继续处理请求。生产环境应该禁止使用save。 ##### 自动触发 - 修改**redis.conf**添加如下格式代码: ```shell save m n ``` > m 单位:s,**m n** 表示 m秒内发生n此变化,会执行bgsave。 - 主从复制。节点执行全量复制,主节点会执行bgsave,将rdb文件发送给从节点。 - shutdown操作。自动持久化。 #### 文件操作 ##### 存储设置 - 设置存储路径,默认是redis根目录。 ```shell config set dir path ``` - 指定文件名,默认是dump.rdb。 ```shell config set dbfilename test.rdb ``` ### AOF redis在执行每次的写入命令记录到单独的日志文件中,类似于mysql日志先行的策略。有更好的实时性,数据损失较小。 #### 启用AOF 修改**redis.conf**,修改 ```shell appendonly no ``` 为 ```shell appendonly yes ``` #### 执行过程 1. 将redis的**修改**命令追加到缓冲区aof_buf 2. 根据不同的同步策略将aof_buf中的内容同步到硬盘中 3. 定期重写aof文件,达到压缩的目的 #### 重写aof ##### 目的 redis在长期运行过程中,aof日志会越来越大。如果发生意外重启,重放整个aof日志会消耗大量时间,导致这段时间内redis无法对外提供服务,故需要对redis进行减肥。 ##### 原理 redis提供了 bgrewriteaof 命令,redis重新fork一个子进程对内存中的数据转化成命令,写入一个新的aof日志文件,同时追加操作期间的新的日志,完成后,放弃对旧文件进行操作。在重写过程中,**过期的数据,无效的数据不再写入,进行命令优化**,从而达到减肥的效果。 ##### 触发方式 ###### 手动触发 执行 bgrewriteaof 命令 ###### 自动触发 当 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 两个参数同时满足触发重写机制,执行bgrewriteaof。 auto-aof-rewrite-min-size > 执行AOF重写时,文件最小体积,默认是64m auto-aof-rewrite-percentage > 执行AOF重写时,当前AOF大小即aof_current_size 与 上次重写时AOF大小即aof_base_size的比值 获取参数值 ```shell config get auto-aof-rewrite-min-size ``` 通过 info persistence 获取aof_current_size、aof_base_size值 ### 启动加载顺序 AOF优先级比RDB高。当AOF开启时会优先加载AOF文件恢复数据,只有当AOF关闭时,redis会自动检测rdb文件,自动载入,此时redis服务器属于阻塞状态,直到数据恢复完成。 [深入学习Redis持久化][9] [9]: https://www.cnblogs.com/kismetv/p/9137897.html "深入学习Redis持久化"