知识点21:Redis持久化:AOF设计
- 目标:掌握Redis的AOF持久化机制
- 路径
- step1:问题
- step2:AOF方案
- step3:优缺点
- step4:持久化方案
- 实施
- 问题
RDB存在一定概率的数据丢失,如何解决?
- AOF方案
- 思想
- 按照一定的规则,将内存数据的操作日志追加写入一个文件中
- 当Redis发生故障,重启,从文件中进行读取所有的操作日志,恢复内存中的数据
- 重新对Redis进行执行,用于恢复内存中的数据
- 过程
- 实现:追加的规则
- appendfsyncalways
- 每更新一条数据就同步将这个更新操作追加到文件中
- 优点:数据会相对安全,几乎不会出现数据丢失的情况
- 缺点:频繁的进行数据的追加,增大磁盘的IO,导致性能较差
- appendfsynceverysec
- 每秒将一秒内Redis内存中数据的操作异步追加写入文件
- 优点:在安全性和性能之间做了权衡,性能要比always高
- 缺点:有数据丢失风险 ,但最多丢失1秒
- appendfsyncno
- 交给操作系统来做,不由Redis控制
- 肯定不用的
- 优缺点
- 优点:安全性和性能做了折中方案,提供了灵活的机制,如果性能要求不高,安全性可以达到最高
- 缺点
- 这个文件是普通文本文件,相比于二进制文件来说,每次追加和加载比较慢
- 数据的变化以追加的方式写入AOF文件
- 问题:文件会不断变大,文件中会包含不必要的操作【过期的数据】
- 解决:模拟类似于RDB做全量的方式,定期生成一次全量的AOF文件
- 应用:数据持久化安全方案,理论上绝对性保证数据的安全
- 持久化方案:两种方案怎么选?
- 两种方案都可以用:默认不配置AOF,使用的RDB
- 问题**:两种都用,**重启Redis加载的是谁的数据?
- 加载AOF
- 小结
- 什么是AOF机制?
- 按照一定的规则将内存中的变化追加记录在一个日志文件中
- 规则
- always:内存变化一条,就追加磁盘一条,安全性高,性能差
- everysesc:每一秒将这一秒内存的变化追加到磁盘中,安全和性能做了折中
- no:不用
- 优点
- 安全和性能的选择更加灵活,安全性更高
- 缺点
- 追加到普通日志文件:相比于二进制来追加和恢复都要慢一些
- 日志文件越来越大,里面会包含很多无用数据操作:根据规则来构建全量的AOF
- 应用:Redis作为数据库或者缓存
知识点22:Redis持久化:AOF实现
- 目标:实现AOF持久化
- 实施
- 开启并配置
vim redis.conf #594行:开启aof appendonly yes #624行:默认每s刷写一次 appendfsync everysec #665,666 #增幅100%就重新覆盖一次 auto-aof-rewrite-percentage 100 #文件至少要大于64MB,一般建议更改为GB大小 auto-aof-rewrite-min-size 64mb
shutdown redis-start.sh
- 查看数据
keys *
- 从AOF文件恢复数据
- 查看aof文件
ll /export/server/redis/datas
- 小结
- 实现AOF持久化
附录一:Jedis Maven依赖
<properties> <jedis.version>3.2.0</jedis.version> </properties> <dependencies> <!-- Jedis 依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <!-- JUnit 4 依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>