Redis 持久化机制

news2024/10/5 19:10:41

个人博客地址:

文章目录

  • Redis 持久化机制
  • 1. 概述
  • 2. RDB
    • 2.1 手动快照
    • 2.2 自动快照
  • 3. AOF
    • 3.1 AOF机制
    • 3.2 AOF文件的重写
  • 4. 混合型持久化
  • 5. 总结

Redis 持久化机制

1. 概述

Redis​为了保证性能,会将所有数据放在内存中,那么万一Redis宕机,数据岂不是全部丢失了?

不要怕,Redis自然想到了这一点,它提供了三种持久化机制将内存中的数据持久化到磁盘中。

  1. RDB

    快照方式持久化(snapshot),快照在Linux就已经学过,保存所有数据的状态,下次开机直接按照这个状态恢复。

    因为保存的快照是以.rdb结尾的文件,故称此方式为RDB持久化方式。

  2. AOF

    (append only file)只追加日志文件,记录Redis所有写命令,下次开机将这些命令全部执行,即可恢复数据。

  3. 混合型持久化

    RDB虽然快,但是数据丢失问题较为严重;AOF虽然能保证数据安全,但是执行所有命令需要很长时间。

    所以Redis4.x以后,将两种方式结合,RDB文件的内容放在AOF文件中,以.aof文件的形式存储。在恢复数据时,先加载rdb的内容,再执行aof的内容。缺点是两种格式混合在一起难以阅读。

需要注意的是,不论是哪种方式,都无法保证数据的绝对安全。

2. RDB

snapshot想必大家已经不陌生了,Linux已经接触过这个机制:保存现在的状态,随时准备恢复。

拍摄的快照以**.rdb**的形式保存在磁盘中。

假如在Redis宕机之前拍摄的快照为:
image
那么下次开机就可以即将这两个数据恢复。

Redis提供了两种拍摄快照的方式 :自动、手动。其中手动拍摄快照有两个命令:save、bgsave
image

2.1 手动快照

  1. save

    由主进程完成快照的拍摄,持久化过程中其他命令阻塞。
    image

  2. bgsave
    background save,主线程fork出一个子进程,由这个子进程完成持久化。

    image

fork :

当一个进程创建子进程时,底层的操作系统会创建该进程的副本,在类unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到父进程/子进程对内存进行写操作后结束共享,各用各的。

2.2 自动快照

在redis.conf配置文件中存在,参数如下:(版本不同,默认参数不同)

#   * After 3600 seconds (an hour) if at least 1 key changed
#   * After 300 seconds (5 minutes) if at least 100 keys changed
#   * After 60 seconds if at least 10000 keys changed

# save 3600 1
# save 300 100
# save 60 10000

解释 :

1h内有一个键被改变会触发快照拍摄。

5mins内有100个键被改变会触发快照拍摄。

1min内有10000个键被改变会触发快照拍摄。

这些快照的拍摄方式都是bgsave。

优点 :

  • rdb文件的加载速度特别快,远超aof。

  • 使用单独子进程来进行持久化,主进程不会进行任何 IO 操作。

缺点 :

  • 容易造成数据丢失。

  • 每次拍快照都要创建子进程,浪费资源.。

3. AOF

这种机制可以将所有客户端执行的写命令记录到日志文件中,AOF​持久化会将被执行的写命令写到AOF文件末尾,以此来记录数据发生变化的全过程,因此只要Redis从头到尾执行一遍AOF文件中的命令,就可以恢复之前的数据。

3.1 AOF机制

RDB​是间隔一段时间进行持久化,如果持久化之间的时间内发生故障,会出现数据丢失。而AOF​持久化方式能很好的解决RDB​持久化方式造成的数据丢失,AOF​持久化到硬盘中的并不是内存中的数据快照,而是将所有写命令记录到日志中

AOF能做到最多丢失1s内的数据,甚至不丢失数据。

Redis提供了三种AOF策略 :

  • appendfsync always

    每执行一次写命令,都对aof文件续写。

  • appendfsync everysec

    每一秒进行一次aof文件续写,这一秒的写命令都会记录。

  • appendfsync no

    并不是不开启,而是将aof续写的时机交给操作系统管理,操作系统开心了就续写,不开心就不续写。

优点 :

  • 保证数据丢失风险降到最低

缺点 :

  • aof文件的体积会很大,同时加载速度很慢

3.2 AOF文件的重写

随着Redis​在线上运行的时间越来越久,客户端执行的命令越来越多,AOF​的文件也会越来越大。

当我们执行100次set name 张三​,其中99次都是多余的,因为想要恢复只要执行一次set name 张三​就行了。为了压缩AOF文件的体积,Redis提供了AOF文件重写机制​。

有两种方式触发AOF的重写机制:

  • 手动:执行bgrewrite​,background rewrite,不会阻塞Redis

  • 自动:在配置文件中进行配置

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    

    当AOF文件体积大于64MB,或者比上一次重写之后体积大了100%,会自动触发。

    如果重写过于频繁,可以考虑将auto-aof-rewrite-percentage设置为更大。

重写的原理 :

重写AOF文件的操作并不是基于原本的AOF文件,而是讲真个内存中的数据库内容用命令的方式重写了一个新的AOF文件,替换原有的AOF文件,这样可以避免一些无用的命令。

4. 混合型持久化

因为RDB​虽然加载快但是存在数据丢失,AOF​数据安全但是加载缓慢,Redis​为了解决这个问题,带来了一个新的持久化选项——混合持久化。将RDB​文件的内容和增量的AOF​日志文件存在一起。这里的AOF​日志不再是全量 的日志,而是自持久化开始到持久化结束的这段时间发生的增量AOF​日志,通常这部分AOF​日志很小。Redis​重启的时候,可以先加载RDB​的内容,然后再重放增量AOF​日志,就可以完全替代之前的AOF​全量文件重放,恢复效率因此大幅得到提升(混合型持久化最终生成的文件后缀是.aof​,可以通过redis.conf​文件中aof-use-rdb-preamble yes​配置开启)。

  • 优点:

    结合了RDB​和AOF​的优点,使得数据恢复的效率大幅提升

  • 缺点:

    兼容性不好,Redis-4.x​新增,虽然最终的文件也是.aof​格式的文件,但在4.0​之前版本都不识别该aof​文件,同时由于前部分是RDB​格式,阅读性较差。

5. 总结

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AcWing 756. 蛇形矩阵

目录问题描述思路与代码1. 个人解法2. 官方题解问题描述 原题链接🔗:756. 蛇形矩阵 输入两个整数 nnn 和 mmm,输出一个 nnn 行 mmm 列的矩阵,将数字 111 到 nmnmnm 按照回字蛇形填充至矩阵中。 具体矩阵形式可参考样例。 输入格…

synchronized底层原理

synchronized是JVM内置锁,基于monitor机制实现,依赖底层操作系统的互斥源语Mutex(互斥量),它是一个重量级锁,性能较低。 当然,JVM内置锁在1.5之后版本做了重大优化,如锁粗化&#xf…

[红明谷CTF 2021]JavaWeb

0x01 好久没打过ctf了,最近也在学Java 就看下java的题吧 WP 进入环境就提示访问 /login ,访问之后 提示的 /json ,试着访问一下 给了 jessid,继续访问 /json 的话 又会跳转至 /login 应该是要传点username password 果然是了&#…

web制作网页

HTML(人的骨架): 标签 1.超文本标记性语言 2.当前最新版HTML5 3.URL统一资源定位器(网址) 4.网站首页名称index.html,default.htm,main.heml 基本结构: 注意:1.标签都是小写 2.标签成对写 3.代码要层次缩进…

JavaScript内存管理

JavaScript 是一个弱类型的、动态语言,在执行一段 JS 代码时,需要经历编译、执行、内存回收阶段。 一、编译阶段 JS 代码执行时,会首先创建全局执行上下文、以及函数执行上下文,上下文的执行顺序按照栈的方式进行调用&#xff0c…

面试题: JVM内存结构

目录目的资源概览JVM内存溢出分类类型1: OutOfMemoryError类型2: StackOverflowError方法区与永久代、元空间之间的关系目的 学习记录, 面试准备 资源 B站的一个讲高频面试题的一个学习视频 概览 线程私有 ① 程序计数器 ② 虚拟机栈线程共享 ① 堆 ② 方法区 JVM内存溢…

RSA密钥协商过程

目录 TSL握手过程 RSA密钥协商握手过程 TLS第一次握手 TLS第二次握手 客户端验证证书 TLS第三次握手 TLS 第四次握手 RSA 算法的缺陷 TSL握手过程 HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随…

linux常用指令讲解

文章目录 前言一、指令详解总结前言 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操…

分布式锁的实现

目录分布式锁分布式锁的引出单体锁存在的问题分布式锁的引出分布式锁的设计思路分布式锁的常见应用场景分布式锁方案分布式锁 分布式锁的引出 单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问…

【Kuangbin简单DP】平整数组

4562. 平整数组 - AcWing题库 题意&#xff1a; 思路&#xff1a; 一开始想的是 设DP状态是&#xff1a;dp[i][0/1]表示阶段到 i &#xff0c;然后前面是递增or递减的最小sum的集合 然后我是怎么转移的呢&#xff0c;现在看来感觉挺好笑的&#xff1a; #include <bits/…

Golang 函数使用的注意事项和细节

来自&#xff1a;尚硅谷-韩老师 尚硅谷 1&#xff09;函数的形参列表可以是多个&#xff0c;返回值列表也可以是多个 2&#xff09;形参列表和返回值列表的数据类型可以是值类型和引用类型 3&#xff09;函数的命名遵循标识符命名规范&#xff0c;首字母不能是数字&#xf…

京东购物成功订单已开具个人发票不能报销怎么申请更换重新开具企业发票用于报销?

原文来源&#xff1a;https://www.caochai.com/article-4109.html 京东购物订单的发票开成个人了可以更换成企业发票吗&#xff1f; 可以&#xff0c;通过京东购物完成的订单默认开个人发票&#xff0c;如果对发票有要求需要开企业发票的可以申请更换重新开企业发票&#xff1…

一文读懂JVM虚拟机:JVM虚拟机的内存管理(万字详解)

JVM虚拟机的内存管理 文章目录JVM虚拟机的内存管理JVM与操作系统Java虚拟机规范和 Java 语言规范的关系java虚拟机的内存管理JVM整体架构一、PC 程序计数器二、虚拟机栈三、本地方法栈四、堆Java 堆概念年轻代和老年代对象分配过程堆GC元空间为什么要废弃永久代&#xff0c;引入…

动手学习深度学习-《矩阵运算》

标量导数 常用求导&#xff1a; yyyaaaxnx^nxnexp(x)exp(x)exp(x)log(x)log(x)log(x)sin(x)sin(x)sin(x)dydx\frac{dy}{dx}dxdy​000nxn−1nx^{n-1}nxn−1exp(x)1x\frac{1}{x}x1​cos(x)cos(x)cos(x) 求导公式&#xff1a; yyyuvuvuvuvuvuvyf(u),ug(x)yf(u),ug(x)yf(u),ug(x)d…

植物大战僵尸:学会使用人造指针

通过向游戏中注入一段特殊的汇编代码&#xff0c;实现自动获取动态地址&#xff0c;省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址&#xff0c;游戏根本无法找到基址。 1.打开CE工具并附加游戏进程&#xff0c;首先通过遍历的方式找到阳光的动态地址&…

zookeeper之master选举代码实现

master选举的基本概念 &#xff08;1&#xff09;假设有一个系统A,它向外提供了一个服务&#xff0c;叫做服务B。并且这个服务需要24小时持续不断的向外提供。也就是提供服务的机器不能够有单点故障。于是我们考虑使用集群。 &#xff08;2&#xff09;我们采用的是master-sla…

傻白入门芯片设计,如何做文献笔记(十九)

Article: 文献出处&#xff08;方便再次搜索&#xff09; 作者文献题目文献时间Data: 文献数据&#xff08;总结归纳&#xff0c;方便理解&#xff09; 这篇文章的目的结论背景介绍结果方法&#xff08;可选&#xff09;Comments: 对文献的想法 &#xff08;强迫自己思考&#…

Java人脸识别相册分类按时间分类相册按城市分类相册app源码

简介 后台Java&#xff0c;前台mui开发的android app&#xff1b;主要是按拍摄时间&#xff0c;人脸&#xff0c;城市进行相册照片的分类。 演示视频 https://www.bilibili.com/video/BV1XP4y187rA/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技…

MySQL调优-Explain详解和索引最佳实践

目录 Explain工具介绍 Explain分析示例 explain 两个变种 explain中的列 1.id列 2.select_type列 3. table列 4.type列 5. possible_keys列 6. key列 7. key_len列 8. ref列 9. rows列 10.Extra列 索引最佳实践 1.全值匹配 2.最左前缀法则 3.不在索引列上做任何操…

2D 平台动作冒险游戏

本文实现比较流畅的跑和跳跃 跑的动画需要从idle经历到walk再到run的过程&#xff0c;这个过程可以用融合树实现 也可以让玩家在按下按键时先固定播放完一个walk的动画&#xff0c;然后再自动切换到run的状态。 只不过在任何状态时&#xff0c;只要玩家松开了按键&#xff0c;…