Redis持久化
RDB快照(snapshot)
在默认情况下,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中。
你可以对Redis进行设置,让它在“
N
秒内数据集至少有
M
个改动”这一条件被满足时,自动保存一次
数据集。
比如说,以下设置会让Redis在满足“
60
秒内有至少有
1000
个键被改动”这一条件时,自动保存一次
数据集:
#save601000//
关闭RDB只需要将所有的save保存策略注释掉即可
还可以手动执行命令
生成RDB快照
,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件,
每次命令执行都会将所有redis内存快照
到一个新的rdb文件里,并覆盖原有rdb快照文件。
bgsave的写时复制(COW)机制
Redis借助操作系统提供的写时复制技术(Copy-On-Write,COW),在生成快照的同时,依然可以正常
处理写命令。简单来说,bgsave子进程是由主线程fork生成的,可以共享主线程的所有内存数据。
bgsave子进程运行后,开始读取主线程的内存数据,并把它们写入RDB文件。此时,如果主线程对这些
数据也都是读操作,那么,主线程和bgsave子进程相互不影响。但是,如果主线程要修改一块数据,那
么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave子进程会把这个副本数据写入RDB文
件,而在这个过程中,主线程仍然可以直接修改原来的数据。
save与bgsave对比:
命令 save bgsave
IO类型 同步 异步
是否阻塞redis其它命令 是
否(在生成子进程执行调用fork函
数时会有短暂阻塞)
复杂度 O(n) O(n)
优点 不会消耗额外内存 不阻塞客户端命令
缺点 阻塞客户端命令 需要fork子进程,消耗内存
配置自动生成rdb文件后台使用的是bgsave方式。
AOF(append-onlyfile)
快照功能并不是非常耐久(durable):如果Redis因为某些原因而造成故障停机,那么服务器将丢失
最近写入、且仍未保存到快照中的那些数据。从1.1版本开始,Redis增加了一种完全耐久的持久化方
式:AOF持久化,将
修改的
每一条指令记录进文件appendonly.aof中(先写入oscache,每隔一段时间
fsync到磁盘)
比如执行命令
“setzhuge666”
,aof文件里会记录如下数据
1
*3
图灵-诸葛老师