缓存:数据可以丢、追求极速!
数据库: 数据绝对不能丢的,速度+持久性
so: 当数据库的时候,需要数据持久化!
存储层:
1.快照、副本
2.日志
怎么持久化?
1.在当前县城开始持久化,假如8点开始持久化,8点半持久化完成,8点时候a=10 8点半时候a=20,那么到底持久化10还是20,如果持久化20,那么当前持久化会不会永久停止不下来?
redis持久化会创建一个子进程进行fork
内核机制是: copy-on-write
子进程和父进程使用同一份内存,父进程数据被修改,指针会指向新的地址,子进程的指针永远指向fork那个时间点的内存地址,所以子进程可以慢慢的鞋,数据不会受到影响。
持久化方式:
1.redis不对外提供服务,然后慢慢写入文件(阻塞)
2.非阻塞 + 数据落地,问题:redis数据持续变更,还不断的持久化,就会造成持久化的数据和redis数据不一致,怎么解决?
思路整理:
[root@redis redis-5.0.5]# num=0
[root@redis redis-5.0.5]# echo $num
0
[root@redis redis-5.0.5]# ((num++))
[root@redis redis-5.0.5]# echo $num
1
[root@redis redis-5.0.5]# ((num++)) | echo ok
ok
[root@redis redis-5.0.5]# echo $num
1
[root@redis redis-5.0.5]# echo $$
1421
[root@redis redis-5.0.5]# echo $BASHPID
1421
[root@redis redis-5.0.5]# echo $BASHPID | more
1555
管道:
1,衔接,前一个命令的输出作为后一个命令的输入
2,管道会触发创建【子进程】 1421是父进程、1555子进程
3.进程之间是隔离的
4.父子进程的数据隔离
5.export的环境变量,子进程的修改不会破坏父进程,父进程的修改也不会破坏子进程((export父进程可以让子进程看到命令))
1. linux创建子进程,8点开始持久化、10点写完
2. 子进程fork(),只是将父进程指向的内存地址copy一份。(很快的)
3. 父进程修改自己的数据,子进程是不受影响的,
4. 内核机制、写时复制copy on write
RDB
1.时点性保存
2.save 关机维护
3.bgsave fock()子进程
4.配置文件中的save就是bgsave
save 900 1 达到900秒且1个
save 300 10 达到300秒且10个
save 60 10000 达到60秒且10000个
弊端:
1.只有一个dump.db
2.丢失数据多
3.优点:类似java中的序列化,回复速度快
redis60S保存一次,假如到达59S挂了,会丢失这59S内所有的数据
AOF
1.丢失数据少
2.redis中 RDB和AOF同时开启,如果开启了AOF只会用AOF恢复,4.0以后AOF包含RDB全量,增加记录新的操作
假如redis运行了10年,只开启了AOF,10年间,一直对一个key进程创建、修改、删除。10年底redis挂了。
1.请问假如AOF10T, 恢复,会不会溢出。
答:不会
恢复需要多久?
答: 5年
弊端:
1.体量变得无限大
2.恢复慢
AOF+RDB
1. 4.0以前 删除抵消的命令,合并重复的命令
2. 4.0以后将老数据RDB到aof文件中
1. appendonly yes 开启AOF
2. appendfilename "appendonlu.aof" 追加rdb数据到aof
3. appendfsync everysec 每秒(aof写)
#appendfsync always 每次
appendfsync no
appendfsync解释:就相当于java的flush,最后一次数据不足需要刷新,no就相当于最后一次不刷新
aof和rdb合并,aof只要不触发 bgrewriteaof,可以手动修改aof文件,恢复操作。