当前位置: 首页 > 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元信息标签,其中键名称…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

EtherNet/IP转DeviceNet协议网关详解

一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

SpringTask-03.入门案例

一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...