当前位置: 首页 > news >正文

【Redis】内存数据库Redis进阶(Redis持久化)

目录

    • 分布式缓存 Redis 四大问题
    • Redis 持久化
      • RDB (Redis DataBase)
        • RDB执行时机
        • RDB启动方式——save指令
          • save指令相关配置
          • save指令工作原理
          • save配置自动执行
        • RDB启动方式——bgsave指令
          • bgsave指令相关配置
          • bgsave指令工作原理
        • RDB三种启动方式对比
        • RDB特殊启动形式
        • RDB优点与缺点
      • AOF (Append Only File)
        • AOF写数据三种策略 (appendfsync)
        • AOF相关配置
        • AOF工作流程
        • AOF重写
          • AOF重写作用
          • AOF重写规则
          • AOF重写方式
          • AOF重写流程
      • RDB (Redis DataBase) VS AOF (Append Only File)

分布式缓存 Redis 四大问题

基于 Redis 集群解决单机 Redis 存在的四大问题:
在这里插入图片描述

Redis 持久化

  防止数据的意外丢失,确保数据安全性,利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。

  持久化过程保存什么:

  • 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
  • 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程
    在这里插入图片描述

RDB (Redis DataBase)

  RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。快照文件称为RDB文件,默认是保存在当前运行目录。
  在进行 RDB 的时候,Redis 的主线程是不会做 IO 操作的,主线程会 fork 一个子线程来完成该操作;Redis 调用 fork,同时拥有父进程和子进程。子进程将数据集写入到一个临时 RDB 文件中。当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
  这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益,因为是使用子进程进行写操作,而父进程依然可以接收来自客户端的请求。fork 采用的是 copy-on-write 技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
    在这里插入图片描述
    在这里插入图片描述

RDB执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令
  • 执行bgsave命令
  • Redis停机时
    Redis停机时会执行一次save命令,实现RDB持久化。
  • 触发RDB条件时
    save second changes 其中 second:监控时间范围,changes:监控key的变化量。save “” 则表示禁用 RDB

RDB启动方式——save指令

# 手动执行一次保存操作,save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
saveredis-cli -p 6379
127.0.0.1:6379> 
127.0.0.1:6379> save
OK
# 在redis安装目录的data目录生成dump.rdb文件
save指令相关配置
  • dbfilename dump.rdb
    说明:设置本地数据库文件名,默认值为 dump.rdb
    经验:通常设置为dump-端口号.rdb
  • dir
    说明:设置存储.rdb文件的路径。
    经验:通常设置成存储空间较大的目录中,目录名称data
  • rdbcompression yes
    说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩。
    经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)。
  • rdbchecksum yes
    说明:设置是否进行 rdb 文件格式校验,该校验过程在写文件和读文件过程均进行。
    经验:通常默认为开启状态,如果设置为 no,可以节约读写性过程约 10% 时间消耗,但是存储一定的数据损坏风险。

在这里插入图片描述
数据恢复演示:

# 关闭redis进程
ps -ef | grep redis-
kill -9 端口号# 启动redis,观察是否有数据
redis-server conf/redis-6379.conf 
redis-cli -p 6379
>keys *
>"输出" # 关闭前的数据存在,持久化生效
save指令工作原理

在这里插入图片描述

save配置自动执行

  反复执行保存指令,忘记了,不知道数据产生了多少变化,何时保存。由 Redis 服务器发起指令(基于条件)自动执行保存数据。

# 在conf文件中进行配置,重新以配置文件启动,满足限定时间范围内key的变化数量达到指定数量即进行持久化 
# second:监控时间范围,changes:监控key的变化量
save second changes

在这里插入图片描述

RDB启动方式——bgsave指令

  数据量过大,单线程执行方式造成效率过低,需要后台执行( Redis 操作者(用户)发起指令;Redis 服务器控制指令执行)

# 手动启动后台保存操作,但不是立即执行,开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。
bgsave
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 25
OK
127.0.0.1:6379> get age
"25"
127.0.0.1:6379> bgsave
Background saving started# 保存在dump.rdb
bgsave指令相关配置
  • dbfilename dump.rdb
    说明:设置本地数据库文件名,默认值为 dump.rdb
    经验:通常设置为dump-端口号.rdb
  • dir
    说明:设置存储.rdb文件的路径。
    经验:通常设置成存储空间较大的目录中,目录名称data
  • rdbcompression yes
    说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩。
    经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)。
  • rdbchecksum yes
    说明:设置是否进行 rdb 文件格式校验,该校验过程在写文件和读文件过程均进行。
    经验:通常默认为开启状态,如果设置为 no,可以节约读写性过程约 10% 时间消耗,但是存储一定的数据损坏风险。
  • stop-writes-on-bgsave-error yes
    说明:后台存储过程中如果出现错误现象,是否停止保存操作。
    经验:通常默认为开启状态。
bgsave指令工作原理

在这里插入图片描述

RDB三种启动方式对比

方式save指令bgsave指令
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

RDB特殊启动形式

  • 全量复制
    在主从复制中详细讲解

  • 服务器运行过程中重启
    debug reload

  • 关闭服务器时指定保存数据
    shutdown save
    默认情况下执行 shutdown 命令时,自动执行 bgsave( 如果没有开启AOF持久化功能 )

RDB优点与缺点

RDB优点:

  • RDB 是一个紧凑压缩的二进制文件,存储效率较高。
  • RDB 内部存储的是 Redis 在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景。
  • RDB 恢复数据的速度要比 AOF 快很多。
  • 应用:服务器中每x小时执行 bgsave 备份,并将 RDB 文件拷贝到远程机器中,用于灾难恢复。

RDB缺点:

  • RDB 方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据。
  • bgsave 指令每次运行要执行 fork 操作创建子进程,要牺牲掉一些性能。
  • Redis 的众多版本中未进行 RDB 文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

RD B文件格式中的 check_sum字段数值用来在载入时判断文件是否损坏

RDB文件格式中的db_version字段记录了RDB文件的版本号

RDB文件格式中的 SELECTDB 常量 pairs 在任何情况下都会存在(错误)。
解释:只有当数据库中有键值对时,RDB 文件中才会有该数据库的信息。

AOF (Append Only File)

解决 RDB 存储的弊端:

  • 存储数据量较大,效率较低 基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低。
  • 大数据量下的 IO 性能较低。
  • 基于 fork 创建子进程,内存产生额外消耗。
  • 宕机带来的数据丢失风险。

解决思路:

  • 不写全数据,仅记录部分数据。
  • 降低区分数据是否改变的难度,改记录数据为记录操作过程。
  • 对所有操作均进行记录,排除丢失数据的风险。

AOF概念
  AOF (append only file) 持久化:以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中命令达到恢复数据的目的。
  与 RDB 相比可以简单描述为改记录数据为记录数据产生的过程。AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

在这里插入图片描述

AOF写数据三种策略 (appendfsync)

  • always(每次)
    每次写入操作均同步到 AOF 文件中,数据零误差,性能较低。

  • everysec(每秒)
    每秒将缓冲区中的指令同步到 AOF 文件中,数据准确性较高,性能较高。
    在系统突然宕机的情况下丢失 1 秒内的数据。

  • no(系统控制)
    由操作系统控制每次同步到 AOF 文件的周期,整体过程不可控。

在这里插入图片描述

AOF相关配置

# 是否开启AOF功能,默认是no
appendonly yes# AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof
appendfilename filename# AOF持久化文件保存路径,与RDB持久化文件保持一致即可
dir# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

在这里插入图片描述

测试添加数据:

127.0.0.1:6379> set age 55
OKcat appendonly-6379.aof
...
set
$3
age
$2
55

AOF工作流程

在这里插入图片描述

AOF重写

在这里插入图片描述
  随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入了 AOF 重写机制压缩文件体积。AOF 文件重写是将 Redis 进程内的数据转化为写命令同步到新 AOF 文件的过程。
  简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。

AOF重写作用
  • 降低磁盘占用量,提高磁盘利用率。
  • 提高持久化效率,降低持久化写时间,提高IO性能。
  • 降低数据恢复用时,提高数据恢复效。
AOF重写规则
  • 进程内已超时的数据不再写入文件。
  • 忽略无效指令,重写时使用进程内数据直接生成,这样新的 AOF 文件只保留最终数据的写入命令,如del key1hdel key2srem key3set key4 111set key4 222
  • 对同一数据的多条写命令合并为一条命令,如 lpush list1 alpush list1 blpush list1 c 可以转化为:lpush list1 a b c
  • 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入 64 个元素。
AOF重写方式
  • 手动重写 (bgrewriteaof 指令)
127.0.0.1:6379> set name 111
OK
127.0.0.1:6379> set name 222
OK
[root@koma data]# cat appendonly-6379.aof127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started[root@koma data]# cat appendonly-6379.aof

在这里插入图片描述

  • 自动重写
# 自动重写触发条件设置
auto-aof-rewrite-min-size size  # AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-percentage percentage  # AOF文件比上次文件 增长超过多少百分比则触发重写# 自动重写触发比对参数(运行指令info Persistence获取具体信息)
aof_current_size
aof_base_size

自动重写触发条件:
在这里插入图片描述

AOF重写流程

在这里插入图片描述

RDB (Redis DataBase) VS AOF (Append Only File)

持久化方式RDB (Redis DataBase)AOF (Append Only File)
占用存储空间小(数据级:压缩)大(指令级:重写)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗高 / 重量级低 / 轻量级
启动优先级
  • 对数据非常敏感,建议使用默认的 AOF 持久化方案
    ​AOF持久化策略使用 everysecond,每秒钟 fsync 一次。该策略 Redis 仍可以保持很好的处理性能,当出现问题时,最多丢失 0-1 秒内的数据。
    ​注意:由于 AOF 文件存储体积较大,且恢复速度较慢。
  • 数据呈现阶段有效性,建议使用 RDB 持久化方案
    ​数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段点数据恢复通常采用 RDB 方案。
  • 综合比对
    RDB 与AOF 的选择实际上是在做一种权衡,每种都有利有弊。
    如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF。
    ​如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB。
    ​灾难恢复选用RDB。
    ​双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量。

相关文章:

【Redis】内存数据库Redis进阶(Redis持久化)

目录 分布式缓存 Redis 四大问题Redis 持久化RDB (Redis DataBase)RDB执行时机RDB启动方式——save指令save指令相关配置save指令工作原理save配置自动执行 RDB启动方式——bgsave指令bgsave指令相关配置bgsave指令工作原理 RDB三种启动方式对比RDB特殊启动形式RDB优点与缺点 A…...

在PHP8中检测数据类型-PHP8知识详解

在PHP 8中,可以使用多种方法来检测数据类型。以下是常用的四种方法:使用 gettype() 函数、使用 is_* 系列函数、使用 get_debug_type() 函数、使用 get_class() 函数。 一、使用 gettype() 函数 gettype() 函数返回给定变量的数据类型。例如&#xff1a…...

​​​amoeba实现MySQL读写分离

​​​amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为…...

angr学习-入门篇

前言: 资源链接:GitHub - jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf 安装: 关于angr…...

基于java SpringBoot和HTML的博客系统

随着网络技术渗透到社会生活的各个方面,传统的交流方式也面临着变化。互联网是一个非常重要的方向。基于Web技术的网络考试系统可以在全球范围内使用互联网,可以在本地或异地进行通信,大大提高了通信和交换的灵活性。在当今高速发展的互联网时…...

动态sql以及常用的标签

什么是动态sql: 指根据不同的条件生成不同的sql 搭建环境: 建表: create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…...

DID以及社交网络中的ZKP

1. 引言 本文关键术语为: Decentralized Identity (DID,去中心化身份) or self-sovereign identity (SSI,自治身份) :是一个基于开放标准的框架,使用自主、独立的标识符和可验证证书,实现可信的数据交换。…...

基于SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…...

2023拒绝内卷!两年转行网络安全真实看法!

我目前转行网络安全两年,没啥天分,全靠努力,基本能够得上中级的水平了。看到大家对转行网络安全挺感兴趣,也有挺多争议,想把我的建议和经验告诉大家。 有很多人觉得网络安全已经饱和了,现在选择这个工作&a…...

【SA8295P 源码分析】57 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_Init 显示屏初始化函数 代码分析

【SA8295P 源码分析】57 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_Init 显示屏初始化函数 代码分析 一、QDI_Panel_Init() 显示屏初始化函数:Panel_DSI_MAX96789_0_Init()二、QDI_Panel_SetPower() 显示屏初始化:Panel_DSI_MAX96789_0_PowerLCD()三、QDI_Panel_GetInfo() …...

IDEA偶尔编译的时候不识别lombok

偶尔IDEA启动项目的时候会识别不到lombok,识别不到get()跟set()方法 方案 在settings添加下面代码 -Djps.track.ap.dependenciesfalse...

rust学习-构建服务器

单线程server 服务器会依次处理每一个请求,在完成第一个连接的处理之前不会处理第二个连接 // cat main.rs use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream;fn main() {let listener TcpListener::bind("127.0.0.1:7878&quo…...

Java并发----进程、线程、并行、并发

一、进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行…...

【计算机网络】第 4 课 - 物理层

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、物理层的基本概念 2、物理层协议的主要任务 3、物理层任务 4、总结 1、物理层的基本概念 在计算机网络中,用来…...

深入理解MVVM架构模式

MVVM原理 MVVM是一种用于构建用户界面的软件架构模式,它的名称代表着三个组成部分:Model(模型)、View(视图)和ViewModel(视图模型)。MVVM的主要目标是将应用程序的UI与其底层数据模…...

配置IPv6 over IPv4手动隧道示例

组网需求 如图1所示,两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接,客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下: 配置IPv4网络。配置接…...

Vue3--->组合式API与Pinia

目录 使用create-vue搭建 1、使用create-vue创建项目 2、项目目录和关键文件 组合式API 1、组合式API - setup选项 2、组合式API - reactive和ref函数 3、组合式API - computed 4、组合式API - watch 1、基础使用 - 侦听单个数据 2、基础使用 - 侦听多个数据 3、immediate&…...

三言两语说透柯里化和反柯里化

JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化的概念、实现原理和应用场景,然后介绍反柯里化的概念、实现原理和应用场景,通过大量的代码示例帮助读…...

细讲TCP三次握手四次挥手(四)

常见面试题 为什么TCP连接的时候是3次?2次不可以吗? 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…...

HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件

卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分: 1.卡片需要在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签,其中键名称…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...