`
liuxinglanyue
  • 浏览: 562524 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

understanding redis internal - 持久化机制

阅读更多

redis 持久化有2种方式,定时快照与append only

 
  1. 定时快照实现方式:

     在上一篇启动流程中提到过,redis启动后有一个定时任务serverCron 每100毫秒执行一次,定时快照就是      在这个任务中执行的,代码如下:

     time_t now = time(NULL);
     for (j = 0; j < server.saveparamslen; j++) {
        struct saveparam *sp = server.saveparams+j;
        if (server.dirty >= sp->changes && now-server.lastsave > sp->seconds) {
            rdbSaveBackground(server.dbfilename);
            break;
          }
     }
   saveparam实际对应的就是配置文件中的save指令,对应时间和改变次数
     save 900 1
     save 300 10
     save 60 10000

    对应结构体定义:
    struct saveparam {
      time_t seconds;
      int changes; 
    }
   server.dirty保存的是上一次持久化后,新产生的变化数量
   可以看到只要配置中的任何一个save指令生效:即超过给定时间且发生了给定的changes,则进行持久化

   再看下rdbSaveBackground函数实现:
   if ((childpid = fork()) == 0) {
        //child
        rdbSave(filename);
        ...
    } else {
       //parent
       server.bgsavechildpid = childpid;
       ... 
    }

    也就是说所说的后台快照进程实际是由主进程fork出来的子进程完成的,由于fork子进程使用的是copy on     write机制,所以子进程可以读取主进程当前的内存空间进行dump工作

    对于子进程rdbSave实际就是把快照内存的所有db的dict数据结构遍历,然后依次写入一个叫
    temp-<child_pid>.rdb的文件中,写完后,rename替换现有rdb文件

    对于主进程要保存快照子进程的pid,之后通过wait系统调用获得子进程退出事件
    主进程在获得快照子进程结束信息后,会调用一个backgroundSaveDoneHandler()函数
    清除一些标志变量和临时dump文件 temp-<child_pid>.rdb

    backgroundSaveDoneHandler最后还要做一件很重要的事,调用updateSlavesWaitingBgsave()
    实际作用和redis的复制相关,回头来叙述这个

  2. append only方式
    
    这种方式实际是任何写入操作都会进行持久化,类似于mysql的binlog方式,优缺点大家可以自己理解了

    从代码上可以看到,实际reids接受到client的消息包,解析完后,会查找一个叫cmdTable的结构体数组,     里面存放,对应命令的回调函数,这段代码实际参考call()函数

        
      static void call(redisClient *c, struct redisCommand *cmd) {
           long long dirty;
           dirty = server.dirty;
           cmd->proc(c);
           dirty = server.dirty-dirty;

           if (server.appendonly && dirty)
                feedAppendOnlyFile(cmd,c->db->id,c->argv,c->argc);
           ...
       }

      cmd->proc实际是调用客户端发来命令对应的回调函数,之后根据命令类型重新赋值dirty,只要有新的        changes就append到aof文件中

      当然redis还提供一些命令可以手工对redis进程持久化操作,比如aof文件过大,可以手工发送rewrite给       服务器
      
      另外需要说明的是:redis的replication实际依赖的是第一种方式,内存快照来实现复制功能的,后续详       细说明
     
   结论:
      1. 内存快照持久化方式,dump数据时不影响redis服务其它的request,但重启会丢失部分数据
      2. aof方式保证不会丢失数据,但同样应该会损失部分性能,不过append only这种方式因为一直是顺序          写入,所以影响应该不是很大

      具体选用哪一个还需要根据业务场景选择

分享到:
评论

相关推荐

    redis校验工具redis-full-check

    对于大型 Redis 集群,可能需要将 `redis-full-check` 结合自动化工具(如 Ansible 或 Jenkins)一起使用,定期执行检查并生成报告。 在维护 Redis 系统的过程中,了解并熟练使用 `redis-full-check` 这样的工具至...

    redis64-2.6.12.1.rar 亲测好用

    5. **redis-check-dump.exe**:这是一个检查RDB持久化文件(dump.rdb)完整性的工具。RDB是Redis的一种持久化方式,它定期将内存中的数据快照保存到磁盘,以便在服务器重启或故障时恢复数据。 6. **redis-check-aof...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    2. **服务化**:为了使Redis在系统启动时自动运行,可以将`redis-server.exe`配置为Windows服务。这可以通过命令行工具`sc create`或使用`.msi`安装包实现。 3. **数据持久化**:Redis支持多种持久化方式,包括RDB...

    PyPI 官网下载 | redis-py-cluster-1.1.0.tar.gz

    3. **数据持久化**:Redis-Py-Cluster支持Redis的数据持久化选项,如RDB快照和AOF日志,以保证数据在系统故障后的恢复。 4. **故障检测与恢复**:库内建了监控机制,可以检测到节点故障,并自动重定向请求到其他...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    Understanding-the-Top-5-Redis-Performance-Metrics

    Redis作为一种高性能、易用且具备持久化功能的键值存储系统,在众多应用场景中脱颖而出。本文将深入探讨Redis性能监控中的五个最重要的指标:内存使用量、命令处理数量、延迟、碎片率以及驱逐策略,并解释如何利用...

    tomcat-redis-session-manager包集合下载(tomcat8)

    tomcat-redis-session-manager是专门为Tomcat设计的一个插件,它实现了SessionManager接口,允许Tomcat将session数据序列化并存储到Redis中。这样,无论用户连接到哪个Tomcat实例,都可以从Redis中获取其session信息...

    Redis-x64-5.0.14.1

    这个名为"Redis-x64-5.0.14.1"的压缩包是Redis针对Windows操作系统的64位版本,版本号为5.0.14.1。在Windows上运行Redis可能与Linux环境有所不同,但仍然提供了相同的核心功能。 1. **Redis的特性**: - **内存...

    redis64-3.0.501.rar

    2. 持久化:为了防止数据丢失,Redis提供了RDB(定期持久化)和AOF(Append Only File)两种持久化策略。RDB会在指定时间间隔保存数据集的快照,AOF记录所有写操作日志,通过回放日志恢复数据。 3. 主从复制:Redis...

    redis+redis-desktop-manager-0.8.3.3850+笔记

    1. 下载源码包:`redis-2.8.13.tar.gz` 是Redis的源码包,解压后进行编译和安装。 2. 解压:`tar -zxvf redis-2.8.13.tar.gz` 3. 编译:`cd redis-2.8.13`,然后`make` 4. 安装:`sudo make install` 5. 启动Redis...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    综上所述,Redis作为一个强大的键值存储系统,其丰富的数据类型、高效的数据操作以及灵活的持久化和复制机制,使其在众多场景下成为首选。正确理解和使用Redis-x64-5.0.14.1版本,能够显著提升应用的性能和可扩展性...

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    标题中的"tomcat-redis-session-manager-1.2-tomcat-7-java-7"表明这是一个针对Tomcat服务器,用于管理session的组件,版本为1.2,适配Tomcat 7和Java 7环境。这个组件的主要作用是将Tomcat的会话管理功能与Redis...

    redis-windows-7.0.10.zip

    Redis的核心组件包括`redis-server.exe`(服务器进程)、`redis-cli.exe`(命令行客户端)以及`redis-benchmark.exe`(性能测试工具)等。用户需要通过`redis-server.exe`启动服务,并通过`redis-cli.exe`进行交互式...

    redis-windows-7.2.4.zip

    - 解压"redis-windows-7.2.4.zip",找到`redis-server.exe`启动文件。 - 运行`redis-server.exe`,默认情况下,Redis监听6379端口。 - 可以通过配置文件`redis.windows.conf`修改默认设置,如端口、内存限制、...

    Redis-x64-3.2.100.zip

    - **redis-check-aof.exe**:用于检查和修复AOF持久化文件的工具。 3. **在Windows上部署Redis**: - 安装服务:使用`redis.windows-service.conf`配置文件创建Redis服务,通过命令行工具`sc create`或使用`redis...

    redis-6.2.6-x64-windows.zip

    4. **安装与配置**:解压后,用户需要将`redis-server.exe`作为服务启动,可以通过`redis.windows.conf`配置文件进行定制化设置,如端口号、日志文件位置、数据持久化策略等。 5. **命令行客户端**:压缩包可能还...

    redis-windows-7.0.8.zip

    6. **持久化机制**:Redis提供了两种持久化方式,RDB(快照)和AOF(Append Only File)。RDB会在指定时间间隔或者满足一定条件时保存当前数据库状态;AOF则记录每次写操作,当服务器重启时,通过重放这些操作来恢复...

    tomcat-redis-session-manager jar包

    1. **高可用性**:Redis具有主从复制和持久化机制,即使主服务器故障,也能通过从服务器接管,保证服务的连续性。 2. **高性能**:Redis是内存数据库,读写速度极快,对于频繁读取和更新的Session数据,性能显著优于...

    redis4.0.11-16离线安装包适应于麒麟V10SP1

    4. **持久化改进**:RDB和AOF两种持久化方式都得到了改进,提供了更好的数据一致性保障和更快的恢复速度。 5. **复制优化**:主从复制功能更加强大,支持批量复制和部分复制,减少了网络传输的数据量,提升了效率。...

    redis-windows-7.2.5.zip

    在Windows环境下安装Redis,可以借助于提供的压缩包"redis-windows-7.2.5.zip"进行。以下是关于Redis及其在Windows上的安装和使用的详细知识: 1. **Redis特性** - **键值对存储**:Redis的核心是键值对模型,其中...

Global site tag (gtag.js) - Google Analytics