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

news2024/11/15 13:52:33

目录

    • 分布式缓存 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,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
save

redis-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 文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

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
OK

cat 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.aof

127.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 来恢复数据,降低丢失数据的量。

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

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

相关文章

2023年的深度学习入门指南(23) - ChatGLM2

2023年的深度学习入门指南(23) - ChatGLM2 在《在你的电脑上运行大模型》这一节,我们曾经介绍过ChatGLM模型,它是当时最好的中文大模型之一。现在,它又更新到了第二代,即ChatGLM2。 当时,我们的技术储备还不足&#…

selenium 遇到更新chorme驱动

打开浏览器,在地址栏输入chrome://version/便可以查看到谷歌当前的版本号 谷歌浏览器驱动的下载网址 http://chromedriver.storage.googleapis.com/index.htmlhttp://chromedriver.storage.googleapis.com/index.html 解压后把chromedriver.exe 放到python安装的目录下&am…

3.netty和protobuf

1.ChannelGroup可以免遍历由netty提供,覆盖remove方法即可触发删除channel\ 2.群聊私聊 13.群聊私聊简单原理图 3.netty心跳检测机制,客户端对服务器有没有读写(读,写空闲) //IdleStateHandler(3,5,7,TimeUnite.SECONDS)是netty提供的检测状态的处理器,也加到pipeline,读,写,…

Windows下FreeImage库的配置

首先下载FreeImage库,http://freeimage.sourceforge.net/download.html,官网下载如下: 内部下载地址:https://download.csdn.net/download/qq_36314864/88140305 解压后,打开FreeImage.2017.sln,如果是vs…

【 Redis】的乱码问题

问题描述: 使用RedisTemplate存储的数据,在 redis-cli 客户端查看时,key 和 value 都会携带类似\xac\xad\这样的字符串。 原因: 由于默认使用了 jdk 的序列化方式。以下是支持的序列化方式 项目一般都会有缓存,常常…

Python人工智能在气象中怎样应用?

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

软件安全测试和渗透测试的区别在哪?安全测试报告有什么作用?

软件安全测试和渗透测试在软件开发过程中扮演着不同的角色,同时也有不同的特点和目标。了解这些区别对于软件开发和测试人员来说非常重要。本文将介绍软件安全测试和渗透测试的区别,以及安全测试报告在软件开发和测试过程中的作用。 一、 软件安全测试和…

【《概率图模型原理与应用:第2版》——概率机器学习与人工智能可解释性领域不可多得的著作】

《概率图模型原理与应用:第2版》反映了PGM的理论基础与进展。取材精炼,层次分明,是一-本很好的关于PGM的专业书籍。同时结合了大量的案例分析与代码算例,使得初学者能快速掌握前沿的PGM理论。本书的翻译与出版能进一步推进国内 人工智能算法领…

Vue3 element-plus表单嵌套表格实现动态表单验证

Vue3结合element-plus表单项可以动态添加/删除 部分效果图如下: 另表格有添加和删除按钮,点击提交进行表单验证。 首先data格式必须是对象包裹数组 import { ref, reactive } from vue; import { FormInstance } from element-plus const froms re…

盘点16个.Net开源项目

今天一起盘点下,16个.Net开源项目,有博客、商城、WPF和WinForm控件、企业框架等。(点击标题,查看详情) 一、一套包含16个开源WPF组件的套件 项目简介 这是基于WPF开发的,为开发人员提供了一组方便使用自…

华为云hcip核心知识笔记(数据库服务规划)

华为云hcip核心知识笔记(数据库服务规划) 1.云数据接库优势 1.1云数据库优点有: 易用性强:能欧快速部署和运行 高扩展:开放式架构和云计算存储分离 低成本:按需使用,成本更加低廉 2.云数据库r…

nmake编译Qt第三方库出现无法打开包含文件type_traits

最近需要为个人项目ShaderLab添加内嵌的代码编辑窗口功能,支持语法高亮和Intellisense,最初使用了QCodeEditor,发现这个第三方的库对词法分析的实现效果不太行. 代码换行后直接缩进到首行,无法定位到前一句的首行 考虑换QScintilla&#xff…

java对象、数组作为函数的入参和出参

在Java编程中,将对象或者数组作为方法的入参传递,可以在方法中修改对象或者数组的值,回传给调用者,这样入参又承担了出参的角色。 代码示例: 定义一个类: package com.thb;public class Point {private i…

深入解析项目管理中的用户流程图

介绍用户流程图 用户流程图的定义 用户流程图(User Flow Diagram)是一种可视化工具,它描绘了用户在应用或网站上完成任务的过程。这些任务可以是购物、注册账户、查找信息等,任何需要用户交互的动作都可以在用户流程图中找到。 用户流程图的重要性 用…

9.索引签名类型,映射类型,索引查询类型

目录 1 索引签名类型 1.1 对象 1.2 数组 2 映射类型 2.1 映射联合类型 2.2 映射类型无法在接口中使用 2.3 映射对象类型 2.4 泛型工具类型都是基于映射类型实现的 3 索引查询类型 3.1 基本使用 3.2 索引查询多个相当于联合类型 1 索引签名类型 1.1 对…

07. Docker网络通信模式

目录 1、前言 2、基本原理 3、Docker网络配置 3.1、查看网络配置 3.2、4种网络模式 3.3、bridge模式 3.3.1、使用bridge网络 3.3.2、自定义bridge网络 3.4、host模式 3.5、container模式 3.6、none模式 4、小结 1、前言 前面我们介绍了Docker容器的相关内容&#…

刷题学算法

刷题学算法 数据结构 一、数组 1. 数组创建: // 方式1:先创建,再逐个存储元素 String[] cityArray1 new String[5]; cityArray1[0] "北京"; cityArray1[1] "上海"; cityArray1[2] "广州"; cityArray1[3…

Metric3D:Towards Zero-shot Metric 3D Prediction from A Single Image

参考代码:Metric3D 介绍 在如MiDas、LeReS这些文章中对于来源不同的深度数据集使用归一化深度作为学习目标,则在网络学习的过程中就天然失去了对真实深度和物体尺寸的度量能力。而这篇文章比较明确地指出了影响深度估计尺度变化大的因素就是焦距 f f f…

【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana

文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Kibana Kibana 是一款适用于Elasticse…

Qt之进程通信-共享内存(含源码+注释)

文章目录 一、内存共享示例图读取文本读取图片 二、界面操作共享内存示例图文本读取示例图图片读取示例图弹窗示例图 二、个人理解与一些心得三、源码简易内存共享Demo创建者接收者 界面共享内存Demo创建者读取者 总结 一、内存共享示例图 读取文本 下图是读取文本的操作&…