golang实现简单的redis服务4.0(持久化)

news/2024/12/12 8:57:45/

      • redis的持久化机制与实现原理
        • RDB工作原理
          • 问题1:如果数量很大怎么办?
          • 问题2:子线程在持久化期间有新的数据写入会发生什么?如何保证数据一致性?
      • AOF的原理
        • 如何解决aof文件越来越大的问题
        • aof文件如何重写?
        • aof如何恢复数据
        • aof文件有问题(损坏了)恢复会发生什么?怎么办?
        • aof有哪些模式?
      • RDB与AOF的优缺点

仓库地址: https://github.com/dengjiayue/my-redis-v2.0-RESP-.git

redis_4">redis的持久化机制与实现原理

  • redis的持久化机制有两种RDB(数据快照)与AOF(文件追加)
RDB工作原理

RDB的触发形式有两种,一种是save,一种是bgsave

  • save:会阻塞服务器直到持久化完成,期间不接受其他的请求.可能会造成大量的请求积压,影响redis的性能

  • bgsave:主线程会fork一个子线程去进行持久化操作,生成新的RDB文件,然后替换旧的文件,通知主线程并退出

问题1:如果数量很大怎么办?

一般会使用bgsave,这样主线程的功能还可以正常运行,如果使用save那么会严重影响redis的功能.

问题2:子线程在持久化期间有新的数据写入会发生什么?如何保证数据一致性?

如果在生成RDB是主线程收到了写操作,这些数据会在新的临时空间储存,等持久化完成才回到原本的空间,查询的话先走临时的空间(最新的数据),再走原本空间.保证查询的是最新的数据.

AOF的原理

  • AOF是以文件追加的形式工作的,将收到的请求(写)追加到aof文件中
如何解决aof文件越来越大的问题
  • 随着运行时间的变长,写的命令越来越多,aof文件也越来越大
  • 解决方案就是给aof文件瘦身: AOF文件重写
aof文件如何重写?

最简单的方式就是只保留最新的结果,中间的去除
比如

set number 1
set number 2
set number 3
.....
set number 1000000

那么我们只需要保留最新的结果,而中间的结果可以去除掉,这样可以减少aof文件的大小

aof如何恢复数据

因为我们储存的是请求的命令(写),那么恢复就是读取aof中的命令重新生成数据就行了

aof文件有问题(损坏了)恢复会发生什么?怎么办?
  • redis无法执行损坏的aof文件,会报错
  • redis有aof文件修复功能: 就是清除有问题的键值对
aof有哪些模式?
  1. 每一个写都追加:每次都持久化到磁盘;安全性好,性能差
  2. 1s追加一次:先写到缓冲,每一秒持久化一次磁盘;性能比第一种高很多,有部分数据容易丢失
  3. 不主动执行:性能很高,但是不安全

RDB与AOF的优缺点

对服务的影响:

  • RDB(bgsave)只有fork子线程会阻塞主线程,对主线程(服务)的影响比较小
  • aof每次(写)都会阻塞一下主线程(不写磁盘的除外),特别是每个写都落盘影响最大(写到缓冲器的方式,一秒进行一次同步阻塞很少)

持久化时间与消耗:

  • RDB的持久化时间更长,因为需要加载全部的数据写到磁盘,对内存的消耗比较大,时间比较长
  • AOF是追加的方式,数据少,时间短,消耗低

文件大小:

  • RDB是压缩的二进制的数据,体积小
  • AOF是追加的命令体积大(重写了还是很大,而且会越来越大)

参考:https://blog.csdn.net/w15558056319/article/details/121421463


http://www.ppmy.cn/news/1554451.html

相关文章

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下: //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

基于java+SSM+Vue的家庭记账本小程序设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

前端新手教程:HTML、CSS 和 JavaScript 全面详解及实用案例

一、引言 在当今数字化的时代,前端开发扮演着至关重要的角色,它决定了用户与网页和应用程序交互的体验。HTML、CSS 和 JavaScript 作为前端开发的核心技术,分别负责网页的结构、样式和交互。本教程将为前端新手全面深入地介绍 HTML、CSS 和 …

uniapp实现Android apk自动检测更新强制下载安装

概要 本篇文章主要讲诉uniapp 打包的APK如何实现在线升级功能,实现强制升级更新、可选升级更新、下载进度百分比显示、下载完成自动跳转安装功能,自己项目已经测试没有问题,可以结合自己的项目进行引入使用。 需求分析 1、需要进入app进行检…

java中23种设计模式的优缺点

文兴一言 设计模式分为创建型模式、结构型模式和行为型模式。以下是每种设计模式及其优缺点的详细介绍: 一、创建型模式 简单工厂模式 优点:通过一个共同的工厂类来创建对象,将对象的创建逻辑封装在一个地方,客户端只需要与工厂…

CTF: 在本地虚拟机内部署CTF题目docker

step 1 安装基本依赖 sudo apt-get update sudo apt-get install -y \ca-certificates \curl \gnupg \lsb-releasestep 2 安装docker sudo apt-get remove docker docker.io containerd runc sudo apt-get update sudo apt-get install \apt-transport-https \ca-certificate…

GoldenGate ogg进程参数说明

OGG参数 1.OGG常用操作命令 cd ${OGG安装路径}/ ./ggsci -------进入ogg shell中 注: 1.以下命令均需在ggsci中执行 2.涉及进程以EXT_HY,PM_HY,REP_HY为例 3.涉及trail文件前缀以hy为例1.1.基本运维命令 #查看所有进程状态 info all #查看某个进程的状态 info E…

Toxicity of the Commons: Curating Open-Source Pre-Training Data

基本信息 📝 原文链接: https://arxiv.org/abs/2410.22587👥 作者: Catherine Arnett, Eliot Jones, Ivan P. Yamshchikov, Pierre-Carl Langlais🏷️ 关键词: toxicity filtering, language models, data curation📚 分类: 机器…