首页 > 数据库 >Redis持久化实现的简单过程

Redis持久化实现的简单过程

时间:2022-10-12 16:56:32浏览次数:48  
标签:AOF 持久 bgsave 简单 Redis RDB 进程 写入

Redis有3种实现持久化的方式:AOF日志、RDB快照、混合持久化

Redis写入AOF日志的过程

  • Redis执行完写操作命令后,将命令追加到server.aof_buf缓冲区
  • 通过write()系统调用,将aof_buf缓冲区的数据写入到AOF文件
  • 数据被拷贝到了内核缓冲区page cache
  • 由内核决定何时将数据写入硬盘

Redis实现RDB快照

生成 RDB 文件的两个命令:savebgsave

执行save命令会在主线程生成RDB文件,执行bgsave命令会创建一个子进程来生成RDB文件

执行bgsave命令时,会通过fork()创建子进程,子进程和父进程共享同一片内存数据。因为创建子进程的时候,子进程复制父进程的页表,但页表指向的物理内存还是一个。如果主线程执行读操作,则主线程和 bgsave 进程互不影响;如果主线程执行写操作,则被修改的数据会复制一份副本,然后 bgsave 子进程会把该副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据

混合持久化

在AOF日志重写过程,当开启了混合持久化时,在AOF重写日志时,fork出来的重写子进程会先将与主线程共享的内存数据以RDB方式写到AOF文件,然后主线程处理的操作命令会被记录在重写缓冲区,重写缓冲区里的增量命令会以AOF方式写入到AOF文件,写入完成后通知主进程将含有的RDB格式和AOF格式的AOF文件替换旧版。


本文根据小林coding整理。旨在理解混合持久化实现过程。

标签:AOF,持久,bgsave,简单,Redis,RDB,进程,写入
From: https://www.cnblogs.com/Salinger/p/16784267.html

相关文章

  • Redis实现搜索历史
    需求:实现搜索历史最大保存N条,保存N天一.RedisTemplate Stringkey=RedisKeyPrefix.识虫历史记录.getKey()+SecurityUtils.getLoginUser().getUser().getUserI......
  • Redis 的快速介绍及其基本数据类型和操作
    Redis简介​​Redis​​是一个主要由开发者SalvatoreSanfilippo(Antirez)开发的开源内存数据结构存储器,用于改进其网站的可伸缩性,可以用作数据库、缓存和消息代理等,可以在......
  • redis-介绍
    1、前置知识常识 磁盘和内存中常识 1、寻址 内存中ns级别 磁盘中ms级别 2、带宽 磁盘:百兆到G的的级别,现在的固态硬盘可以达到1-3G中 iobuffer 磁盘磁道、扇区,......
  • 二分法寻找峰值、二分法通俗易懂简单解释讲解
    题目:BM19寻找峰值、力扣162.寻找峰值publicclassSolution{/***保持在上坡的一边一定可以找到峰值,上坡只有两种情况一直为上坡,或者变为下坡这两......
  • Net6 扩展你的Swagger,让它变的更强大,更持久(哈哈哈)
    十年河东,十年河西,莫欺少年穷学无止境,精益求精net6集成了swagger的基础功能,但功能不够用因此只能自定义扩展方法了,如下1、集成Jwt授权   将builder.Services.A......
  • 【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例
    JDK1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK1.5之前,实现任务的......
  • 【redis】主从同步原理
    1.为什么需要主从同步在使用redis服务的时候如果时单机服务,一旦单机服务宕机了,那么可能导致我们整个系统处于不可用状态,或者当系统的访问量大了以后单机的redis服......
  • redis基础系列~单线程与多线程
    纯内存KV操作redis的操作都是在内存实现的,众所周知,在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度,所以非常快.所以内存的大小......
  • leetcode 219. Contains Duplicate II 存在重复元素 II(简单)
    一、题目大意给你一个整数数组nums和一个整数k,判断数组中是否存在两个不同的索引i和j,满足nums[i]==nums[j]且abs(i-j)<=k。如果存在,返回true;否则,返......
  • 力扣350(java&python)-两个数组的交集 II(简单)
    题目:给你两个整数数组 nums1和nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑......