缓存:数据可以丢、追求极速!
数据库: 数据绝对不能丢的,速度+持久性
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文件,恢复操作。