RDB(Snapshot 内存快照) 。RDB是默认的持久化方式,按照一定的策略周期性的将内存中的数据生成快照保存到磁盘。
每次快照持久化都是将内存数据完整写入到磁盘一次。并不是增量,如果数据量过大,会引起大量的磁盘IO,影响性能
1.save 命令
当客户端向Redis
server发送save命令请求进行持久化时,由于Redis是用一个主线程来处理所有,save命令会阻塞Redis
server处理其他客户端的请求,直到数据同步完成。
3.自动触发
除了手动触发RDB持久化,Redis内部还存在自动触发机制,
在配置中集中配置 save m n 的方式,表示 m秒内数据集存在n次修改时,系统自动触发bgsave 操作。
#save 900 1
#save 300 10
#save 60 10000
关闭RDB只需要将所有的save保存策略注释掉,然后重启redis服务即可。
#save 900 1
#save 300 10
#save 60 10000
save ""
# 持久化 rdb文件遇到问题时,主进程是否接受写入,yes 表示停止写入,如果是no 表示redis继续提供服务。
stop-writes-on-bgsave-error yes
# 在进行快照镜像时,是否进行压缩。yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间。
rdbcompression yes
# 配置 redis 是否使用 CRC64 校验算法校验 RDB 文件是否发生损坏,默认开启状态,如果你需要提升性能,可以选择性关闭
rdbchecksum yes
# 生成的快照的文件名
dbfilename dump.rdb
# 存放快照的目录
dir ./
优点:
1. RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份。文件恢复速度快。
缺点:
1. 可能会有部分数据丢失
2. 持久化要全量刷内存到磁盘,成本太高
3. redis不通版本间的RDB文件不兼容
AOF(Append-only file)针对RDB的缺点做了优化,在使用AOF持久化方式时,Redis会将每一个收到的写操作命令都通过Write函数追加到文件最后。当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
bgrewriteaof
重写命令。redis
主进程fork
子进程。client
请求,除了把写命令写入到原来的aof文件中。同时把收到的命令缓存到 AOF重写缓冲区。这样就能保证如果子进程重写失败的话并不会出问题。# 是否开启AOF,默认关闭
appendonly yes
# 指定 AOF 文件名
appendfilename appendonly.aof
# Redis支持三种刷写模式:
#客户端对redis服务器的每次写操作都写入AOF日志文件。但该模式下速度也是最慢的,一般不推荐使用.
# appendfsync always。
#每秒刷新一次缓冲区中的数据到AOF文件,在性能和持久化方面做平衡,推荐该方式。每隔一秒钟启动一个后台任务,用于异步地将文件通过fsync写入磁盘
appendfsync everysec
#完全依赖操作系统写入,时机不确定,性能最好但是持久化最没有保证,不推荐。
# appendfsync no
#在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
#设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes
no-appendfsync-on-rewrite yes
# 同时满足下面两个指标的时候才会发生重写。
#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时
auto-aof-rewrite-percentage 100
#当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
auto-aof-rewrite-min-size 64mb
三种写回命令:
假如 对一个变量做了10次 +1,aof 文件中存在的命令就是10条,重写之后变成一条+10 ,减小文件大小。重写之后不可以恢复,加入执行了FLUSHALL
命令,在没发生重写是可以恢复的。
bgrewriteaof
命令触发AOF 优点
AOF 缺点
集合RDB和AOF的优点,文件的命名还是 .aof ,不过数据结构是RDB和AOF的组合。
# 开启混合模式。重写时机和aof一样
aof-use-rdb-preamble yes