缓存:数据可以丢失,急速。
数据库:数据绝对不能丢失。掉电易失。速度+持久化。
存储层:
1、快照 / 副本
2、日志
快照 / 副本
冷备份:
某一个时间点备份,那么需要停止服务,备份数据。备份完再开启服务,这样就可以保证备份时间点的数据就是这个时间点的数据,否则备份过程中数据发生了改变,那么备份的数据就不是备份时间点的数据了。
热备份:
redis对外提供着服务,为了备份数据而停止服务,这样是不能被允许的。如果不停止服务,而同时进行备份,才是我们希望的。那么,怎么保证备份的过程中,产生的修改,不写入备份中呢,也就是说备份某个时间点的数据,就是这个时间点当前的状态,在备份过程中的修改不会被备份记录呢?
redis对外提供服务用的是主进程,热备份时,创建子进程去做这件事。主进程、子进程各自有一份指针对内存的引用,主进程修改数据,是修改主进程中的指针引用,不会改子进程中指针的引用。
命令save、bgsave
配置文件:save 代表 bgsave
弊端:
1、不支持拉链,只有一个dump.rdb
2、丢失数据相对多一些,时间点与时间点直接窗口数据容易丢失
优点:
类似java中的序列号,恢复的速度相对快
速度快、空间小
创建子进程,使用copy-on-write
某一个时间点,备份数据的时候,热备份,主进程不停止服务。那么,创建一个子进程,把父进程redis到物理内存的指针复制一份到子进程。父进程可以修改数据,改的是指针的引用。而子进程保留了备份时间点的指针引用,然后去写入磁盘,磁盘中保存的就是备份这个时间点的数据,而写入磁盘这段时间,主进程的修改,不会影响到备份的数据。
当主进程修改某个key的值,而这个值在内存中没有,那么就在内存中创建这个值,然后修改key指针的引用,指向新创建的这个值在内存中的位置。子进程在备份中,这个key的指针指向的依然是原来的值所在的内存位置。
日志
redis的写操作记录到文件中
优点:
1、丢失数据少
2、redis中,RDB和AOP可以同时开启
3、如果开启了AOF,只会用AOF恢复
4、4.0以后,AOF中包含RDB全量 ,增加记录新的写操作
弊端:
体量无限变大,恢复慢
日志,优点如果能保证,还是可以用的。设计一个方案让日志、AOF足够小。让日志记录增量,久的日志进行合并。
4.0以前,重写,删除抵消的命令合并重复命令,最终也是一个纯指令的日志文件;
4.0以后,重写,讲老的数据RDB到AOF文件中,讲增量的以指令的方式,Append到AOF。
AOF是一个混合体,利用了RDB的快,利用了日志的全量。
写操作会触发IO
NO
aways
每秒
appendonly yes # appendfsync always appendfsync everysec # appendfsync no
上一篇《07 Redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU》
下一篇《09 Redis的集群:主从复制、CAP、PAXOS、cluster分片集群01》