RDB 持久化

 一、生成RDB

  cmd:SAVE  --阻塞进程,执行完,才能有效接收客户端命令。

  cmd:  BGSAVE  --非阻塞,开启子进程保存。

          客户端如果发送SAVE和BGSAVE命令直接拒绝。

          BGWRITEAOF命令再BGSAVE执行完才能执行。  

 二、载入RDB

  服务器启动时自动执行,检测到RDB文件就会自动加载。

  如果开启AOF,优先使用执行AOF。

  AOF关闭的情况下,才会执行RDB。

三、自动间隔性保存

  save设置:一定条件后执行BGSAVE命令进行保存

  默认设置:

    save 900 1  //900秒内,进行一次修改,触发保存BGSAVE

    save 300 1  //300秒内,10次修改,触发保存BGSAVE  

    save 60  10000   //60秒内,1w次修改,触发保存BGSAVE 

struct saveparam {
time_t seconds; //秒数
int changes;//变化次数
};

还有两个参数:

dirty --上次数据库触发保存命令修改数

lastsave -- 最后一次执行save时间

PORT_LONGLONG dirty;                /* Changes to DB from the last save */ 
 time_t lastsave;                /* Unix time of last successful save */

还有一个定时器默认100毫秒来检测是否满足save条件的方法:serverCron

int serverCron(struct aeEventLoop *eventLoop, PORT_LONGLONG id, void *clientData) 

四、RDB文件结构

  | REDIS | db_version | database | EOF | check_sum |

  RDB文件开头是REDIS,来判定是否是RDB文件。

  db_version  版本号

  databse 包含任意多个数据库(键值对)

  EOF RDB文件结束标志

  check_sum  校验长度

AOF 持久化

一、命令持久化,保存redis 的写命令

二、命令追加

  redis 执行完写命令,将命令按照一定协议格式追加到 aof_buf 缓冲区

sds aof_buf;      /* AOF buffer, written before entering the event loop */

三、AOF文件写入与同步

  resid 服务器进程是一个事件循环

  文件事件:接受命令和输出内容

  时间事件:负责定时任务

  文件事件执行写命令,这样会追加命令到aof_buf 缓冲区,在这写命令结束之前会调用flushAppendOnlyFile 函数判断是否从缓冲区回写到AOF文件。

  写入策略有三个:

    always: 将aof_buf 缓冲区所有内容写入并同步到AOF文件。

    everysec(默认): 将缓冲区内容写入,超过一秒钟,并进行同步。

    no: 将缓冲区的所有内容同步,但是不同步。

四、AOF 载入以及数据还原

  1、创建一个伪客户端

  2、分析aof文件 并解析一条命令

  3、伪客户端执行此命令

  4、循环执行2和3

五、AOF重写

  AOF 存储写命令,体积会膨胀,恢复数据库的时间也会变长。

  新建文件AOF ,去除冗余命令,合并命令。达到缩减文件目的。

六、AOF后台重写

  处理命令请求会因为这个aof重写造成阻塞。

  另起一个子进程,进行aof重写。但是会存在数据不一致的问题,子进程在处理重写一条命令后,同时主进程依然在写当操作对象的命令。造成数据不一致。

  解决方案:开辟aof重写缓存区

  命令会直接写入aof缓存区和aof重写缓存区,这样可以读取缓存区命令进行处理。类似队列,先写入队列进行待处理。

  生成的写命令-->aof缓冲区  -->写入同步到aof文件

  生成的写命令-->aof重写缓冲区 -->  写完  -->发送信号给父进程 --> aof重写缓冲区写入新aof文件 -->原子覆盖旧aof文件

  

  父进程处理命令,保存aof,使用子进程,覆盖重写aof,达到性能最佳不阻塞,同时生成的新aof也是比较小。

Redis 设计与实现 (三)--持久化的更多相关文章

  1. Redis设计与实现 (三): 字典

     哈希表 结构定义dict.h/dictht /* * 哈希表 * * 每个字典都使用两个哈希表,从而实现渐进式 rehash . */ typedef struct dictht { // 哈希表数 ...

  2. redis源码分析(三)--rdb持久化

    Redis rdb持久化 Redis支持两种持久化方式:rdb与aof.rdb将一个节点上的内存数据序列化后存储到磁盘中,序列化的数据以尽可能节约空间的方式存储,并非完全的ascii表示.它的优点在于 ...

  3. 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. Redis基础篇(三)持久化:AOF日志

    Redis是内存数据库,但是一旦服务器宕机,内存中的数据将会全部丢失. 最简单的恢复方式是从后端数据库恢复,但这种方式有两个问题: 频繁访问数据库,会给数据库带来巨大的压力: 从数据库中读取相比从Re ...

  5. Redis | 第5章 Redis 中的持久化技术《Redis设计与实现》

    目录 前言 1. RDB 持久化 1.1 RDB 文件的创建与载入 1.2 自动间隔性保存 1.2.1 设置保存条件 1.2.2 dirty 计数器和 lastsave 属性 1.2.3 检查保存条件 ...

  6. 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  7. Redis设计与实现2.2:数据持久化

    数据持久化 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 RDB持久化 RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原 ...

  8. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

  9. 《Redis设计与实现》读书笔记

    <Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...

  10. 深入学习Redis(2):持久化

    前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可 ...

随机推荐

  1. [转] iOS11.3 fastclick.js相关bug

    最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...

  2. IBOS云办公系统二次开发之功能介绍(PHP技术)

    IBOS自动化办公系统是我见到的功能.架构最好的开源自动化办公系统,功能与企业需求吻合度之高.架构之灵活,让我不得不将之介绍给大家,让跟多需要学习PHP开发的朋友来了解她,拥抱她! 如果您还没有很好的 ...

  3. 双系统恢复CentOS的MBR

    Win7 和 CentOS 的双系统,在重装 Windows 后,CentOS 就无法启动了,因为MBR被Windows重写了. 解决方法就是恢复 CentOS 的MBR,需要借助2款 Windows ...

  4. 使用Fiddler完成Android和IOS手机抓包Https

    实现原理 Fiddler是PC端有名的HTTP抓包工具,利用它我们可以轻松实现对主机上所有http/https网络请求的捕捉.查看和修改操作. 同时它也提供了代理模式,其它主机由它代理发送的网络请求也 ...

  5. js数组删除元素、json删除元素

    //数组var b=[1,2,3,4]; b.splice(b.indexOf(2,1)) //1,3,4 //json var arrayId=[{"id":233," ...

  6. notes for lxf(五)

    类和实例的绑定方法和属性 实例绑定 obj.func = func obj.func(obj, &argv)  obj.func = MethodType(func, obj) 第一个参数是方 ...

  7. Ducci 队列 -基础queue,set

    https://vjudge.net/contest/185301#problem/B 用队列记录,set的不重复性来判断 //#include<bits/stdc++.h> #inclu ...

  8. 微信小程序1

    本次项目主要了解及使用微信小程序,以及更好的理解微信动画,wxss,JavaScript,ajax,xml等技术: 借助的平台是java后端设计语言以及微信小程序界面,设计 该系统分为1,个人用户端: ...

  9. 创建线程的一般方式和匿名内部类方式对比——实现runnable接口,重新run方法

    启动:使用静态代理设计模式 优点:可同时实现继承,避免单继承局限性 一般方式: Programer.java /** * 真实角色 * * @author :liuqi * @date :2018-0 ...

  10. 爬虫之selenium和PhantomJS

    ---恢复内容开始--- selenium selenium是什么? 是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作 环境搭建 .安装: pip instal ...