Redis之1持久化
redis为什么要持久化
1.redis做为数据库使用时,数据库必须提供持久化特性;
2.redis做为缓存使用时,持久化缓存数据:
redis崩溃时重新加载持久化的数据;
redis迁移
redis支持的两种持久化方式
RDB(Redis Database Backup file)
属于全量数据备份,备份的是数据
save 这个是阻塞的。一般在关机维护时使用。
bgsave 这个是由fork()子进程实现的。
配置文件中给出bgsave的规则: (使用的save这个标识)
1 |
|
rdb 的弊端
不支持拉链 只有一个dump.rdb
丢失数据相对多一些 (时点与时点之间窗口数据容易丢失 8得到一个rdb,9刚要落盘一个rdb,挂机了)
rdb的优点
类似java中的序列化,恢复的速度相对快
AOF
append only if,增量持久化备份,备份的是指令
redis的写操作记录到文件中
写操作会触发IO
相关配置:
1 |
|
AOF优点
丢失数据少
AOF弊端
恢复慢
fork()创建子进程
linux父子进程:
父进程的数据,子进程可不可以看得到?
常规思想,进程是数据隔离的!
进阶思想,父进程其实可以让子进程看到数据!
linux中
export的环境变量,子进程的修改不会破坏父进程
父进程的修改也不会破坏子进程
fork()
1,速度:快
2,空间:小
fork()使用的是copy on write机制。
copy on write:内核机制
写时复制
创建子进程并不发生复制。
创建进程变快了。
根据经验,不可能父子进程把所有数据都改一遍。
玩的是指针。
使用 linux fork()出一个子进程,这时主进程还是可以提供服务的。子进程可以看到内存上的数据。如果主进程进行数据的修改,是先由内存创建出一个8的内存空间,主进程a的指向改成8的内存地址。这时子进程中的a的指向还是指向3。所以如果8点开始持久化,就是8点的数据。
aof 文件大,从而导致恢复更慢,redis的演变
都是重写。
4.0以前
删除抵消的命令(add k1 1 del k1)
合并重复的命令 (inby k1 1 重复1000)
最终也是一个纯指令的日志文件
4.0以后
将老的数据RDB到aof文件中
将增量的以指令的方式Append到AOF
AOF是一个混合体,利用了RDB的快,利用了日志的全量
redis中,RDB和AOF可以同时开启
如果开启了AOF,只会用AOF恢复
4.0以后:AOF中包含RDB全量,增加记录新的写操作(aof文件为一个混合文件)