zoukankan      html  css  js  c++  java
  • redis持久化RDB、fork、copywrite

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

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

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

      

     

  • 相关阅读:
    转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
    转:git windows中文 乱码问题解决汇总
    git教程1
    刘汝佳黑书 pku等oj题目
    C/C++ qsort()快速排序用法
    char s[]字串和char *s字串有什麼区别?
    c语言‘’ ,‘0’, “0” ,0之间的区别
    带符号的char类型取值范围为什么是-128——127
    c语言memset详解
    【线性规划与网络流24题】孤岛营救问题 分层图
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14295918.html
Copyright © 2011-2022 走看看