版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/njys1/article/details/82795883
- rdb
- aof
rdb
eg. save 900 1 若900s内有一个键发生改变、则进行持久化存储
1. save 会使用主线程进行同步转储、
bgsave是创建一个子进程进行存储
2. save会阻塞服务器
bgsave、redis主进程会创建一个子进程将转储数据保存到一个temp-%s.rdb 的临时文件中、
转储完成之后、它会被重命名为 dbfilename 指定的文件名、并覆盖dir指定的本地目录中的
旧的转储文件、同时redis主进程继续提供服务
info persistence 可以查看数据持久化状态
rdb_bgsave_in_process 的值为1 、表示当前正在进行持久化存储
若转储过程中、并没有数据写入、写时复制占用的内存并不会很大、
通常会在复制完成后、根据子进程使用的私有数据量输出一条日志、
eg. 777:C 21 Sept 21:22:04.245 * RDB: 12MB of memory used by copy-on-write
这个指标还会记录在 rdb_last_cow_size 中
3. stop-writes-on-bgsave-error 设置为yes的话、作为保护机制、bgsave失败时、Redis服务器会停止接收写入操作
4. rdbcompression 设置为yes、可以明显减小转储文件的大小、但是会在LZF压缩时、会消耗更多CPU
5. rdbchecksum 设为yes会在快照文件末尾创建一个CRC64校验和、使用该选项在保存和加载
快照文件时、会额外消耗约10%的性能、设为no会获得最大性能、但也会降低对数据损坏的抵抗力
6. redis的rdb文件前几个字符是redis、接下来是rdb格式的版本、然后是rdb文件的魔术字符串
保存了redis的8种元数据
redis-ser: redis的版本号
redis-bits: 运行redis的主机架构、64 / 32
ctime: rdb文件创建时的时间戳
repl_stream_db: 复制链中数据库的索引
used-mem: 转储时使用的内存大小
aof-preamble:是否在aof文件的开头防止rdb快照(即是否开启混合持久化)
repl-id: 主实例的id
repl-offset: 主实例的偏移
aof
1. aof: redis其实是维护了一个缓冲区、redis的命令会首先被写入到这个缓存区、
只有缓冲区的内容真正被刷新到磁盘中才能永久保存
在linux中、是调用fsync来完成的、是阻塞调用、
可以通过配置调整fsync的频率
1) always:对每个写入的命令调用fsync
2) everysec:每秒钟调用一次
3) no:不主动调用、由操作系统自己来决定何时操作
redis服务关闭时、fsync会被显式调用、确保缓冲区的数据不丢失
2. 随aof文件内容的增大、文件大小会逐渐增大、拖慢redis重启时数据的重建过程
redis提供了aof重写来压缩aof文件、它会删除过期key、合并key的计数操作、只保留key的最新修改、
重写的过程会在一个子进程进行、子进程创建后、会创建一个 aof_rewrite_buf_blocks 的缓冲区、完成重写后、向父进程发送信号、父进程把 aof_rewrite_buf_blocks 缓冲区的命令写入到新的aof文件、替换原来的文件
3. redis-check-aof可以在系统崩溃后修复受损的aof文件
eg. redis-check-aof --fix appendonly.aof
4. auto-aof-rewrite-min-size 设置文件大小为多大时触发aof重写
5. 可以使用 bgrewrite 手动触发aof文件重写