缓存:数据可以丢、追求极速!

数据库: 数据绝对不能丢的,速度+持久性

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文件,恢复操作。