redis persistence 之 append only file

1、还是先看看官方文档:

注: AOF 持久化日志向服务器获取每次发生的写操作,这日志在服务器启动的时候执行,以恢复原来的数据集。这些写命令会以redis自身协议的相同格式被日志化。当这个日志文件太大时,redis能够在后台重写这日志。(读操作不记录,操作只需追加文件内容,不允许改写文件。)

如果你愿意,你可以完全不持久化,这种情况通常发生在服务器运行时数据存在就行。

在同一个实例中可以结合使用 AOF 和 RDB。在这种情况下,Redi开启时会重新执行 AOF 文件,以使得恢复原来的数据集(因为这种恢复最完整)。

2、具体看看如何操作:

        

a、设置 redis.conf文件,为了让配置文件不太复杂,使用 cp 命令 备份一个 redis_aof.conf文件。

注: 默认为 appendonly no,在之前的配置文件的相关信息中介绍过,修改appendonly yes 表示开启 AOF。

b、 在写入操作时,redis会在工作目录中创建出一个appendonly.aof(即redis持久化日志文件)。

c、执行flushall命令后,后关闭服务器,使用ls -l 命令查看文件,再使用cat 命令查看appendonly.aof文件。(可以看到在同一个实例中可以结合使用 AOF 和 RDB。)

注: 如图示,可以看到appendonly.aof记录了所有写操作命令,包括 select 0,flushall等,如果重启服务器,使用 keys 进行查询,还是会显示空结果。

d、把 appendonly.aof 文件中最后的 flushall 删除后,在启动服务器。

注: 可以看到数据已经被恢复

e、关闭服务器后,破坏appendonly.aof文件,再启动服务器。

发现破坏文件后,服务器已无法启动。由此可知, 在同一个实例中可以结合使用 AOF 和 RDB,服务器开启时redis优先从appendonly.aof文件中读取到内存,后执行命令。

f、键入 /usr/local/bin/redis-check-aof --fix appendonly.aof 指令后,可以重新启动redis服务器。

3、redis.conf 下关于 AOF 的其他相关配置:

a、appendfsync 配置操作:

如图示,可以看到:

always: 同步持久化,每次发生数据变更时立即把操作记录到磁盘中,这中模式安全,但是性能差。

everysec: 出厂默认设置,异步操作,每秒记录。如果在一秒内荡机,这一秒内的数据将会丢失。

no: 即不把数据变更操作记录在磁盘中。

b、no-appendfsync-on-rewrite: 如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes,这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区

5、AOF 的 rewrite:

a、AOF 采用文件追加方式,这意味这文件将会越来越大。针对这一问题,新增了重写机制,当AOF 文件的大小超过了所设定的阙值(临界值)时, Redis 会启动 AOF 文件的内容压缩,只保存数据的最小指令集。

b、重写原理:

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename)。遍历新进程的内存中数据,每条记录有一条Set语句。

重写aof文件操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这一点和快照类似。

c、Redis会记录上次重写时的 AOF 大小时,默认配置是当 AOF 文件大小是上次 rewrite 后大小的一倍且文件大于64M时触发。

6、AOF 相对于 RDB 的劣势:

a、相同数据集的数据而言,aof 文件 要远大于rdb 文件,恢复速度慢于rdb。

b、aof 运行效率要慢于rdb,每秒同步的策略效率较好,不同步效率和rdb相同。

时间: 2024-07-31 10:53:52

redis persistence 之 append only file的相关文章

Unknown command 'flushall' reading the append only file

为了redis cluster禁用一些危险命令,使用的方法都是在配置文件中增加以下内容: rename-command flushall hufuflushall rename-command flushdb hufuflushdb rename-command keys hufukeys 这就带来了问题,在服务器以外重启后,会造成cluster中redis服务启动不了,而且还会报" Unknown command 'flushall' reading the append only file&

Can't rewrite append only file in background: fork: Cannot allocate memory

今天发现redis服务日志报了以下的错误: Can't rewrite append only file in background: fork: Cannot allocate memory Starting automatic rewriting of AOF on 138% growth 从日志看是aof持久化时内存不够用了导致.再看了一下maxmemory的值刚好是物理内存的一半.应该是服务redis持久化内存分配原则的,要给fork出的备份进程流出一半内存的富裕.又执行free命令查看

redis 配置文件 append only file(aof)部分---数据持久化

############################## 仅追加方式 ############################### #默认情况下Redis会异步的将数据导出到磁盘上.这种模式对许多应用程序已经足够了,#但是如果断电或者redis进程出问题就会导致一段时间内的更新数据丢失(取决与配置项)##这种只增文件是可选的能够提供更好的体验的数据持久化策略.#举个例子,如果使用默认的配置数据fsync策略,在服务器意外断电的情况下redis只会丢失一秒中内的更新数据,#或者当redis进

redis报错 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check

redis无法启动,aop文件损坏 运行:   /usr/local/bin/redis-check-aof --fix appendonly.aof 不知道存放路径的可以查找find / -name redis-check-aof 参考来源:https://blog.csdn.net/wang0112233/article/details/86438789 原文地址:https://www.cnblogs.com/weidaijie/p/12122875.html

Redis Persistence 之 redis database

1.关于redis持久化问题,看看官网文档: 注:redis提供了多种不同方式的持久化选项: RDB(即 redis database)持久化表现在特定的时间间隔内某一个时间点的快照.可以理解为,在指定时间间隔内将内存中的数据集快照写入磁盘,也就是常说的snapshot快照,它恢复时是将快照文件直接读入内存中. AOF持久性地记录在服务器中的所有写操作命令,并且在服务器重新启动时执行这些操作命令.(关于AOF会在下一篇博文中介绍.) 补充说明:(redis设置连接数据库密码的操作命令) 注:使用

Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

服务器异常重启之后,在 启动 redis 时,redis-server不断的从日志文件加载数据到内存,到了6G左右时,redis-server 又挂了,再次启动重复这个过程.查看日志,发现报错: 处理方法:redis-check-aof --fix appendonly_6379.aof 然后启动:redis-server: redis-server /etc/redis-6379.conf & ok,搞定. 原文地址:https://www.cnblogs.com/digdeep/p/1264

基于redis分布式缓存实现

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

基于redis分布式缓存实现(新浪微博案例)

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

如何实现redis分布式缓存

摘要: 第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有:  数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题:  水平拆分,对表的拆分,将有的用户放在这个表,