redis持久化机制 事务详解

news2024/11/16 20:42:00

目录

前言:

持久化机制

RDB(Redis DataBase)

手动触发 

save

bgsave

自动触发

RDB特点

AOF(append only file)

缓冲区刷新策略

重写机制

aof重写流程

混合持久化

事务

事务操作命令

WATCH

WATCH实现原理


前言:

    redis为了保证高可用引入了持久化机制,目的就是为了redis服务器重启时可以恢复原有的数据。redis提供了RDB,AOF和混合持久化三种机制,开发者可在不同的业务场景具体选择使用哪一个持久化机制。

持久化机制

RDB(Redis DataBase)

    定期备份,每隔一段时间将内存中的数据刷新到硬盘中,生成一个快照rdb文件(用来恢复数据)。

手动触发 

save

    执行save的时候,redis会全力以赴的进行“快照生成”的操作,此时就会阻塞其他客户端的命令,因为redis是单线程模型。(一般不建议)

bgsave

1)不会影响redis处理其他客户端的命令。redis在后台采用多进程方式生成rdb文件。

2)redis将内存中的数据以压缩的方式保存到二进制文件中(镜像文件,rdb文件)。

3)redis服务器重启时,需要加载这个快照文件,如果快照文件格式不对,redis服务可能会启动失败。同时redis提供了rdb文件检查工具,可以手动执行进行rdb文件校验。

执行流程

    当生成rdb镜像文件时,首先会保存在一个临时文件中,当快照生成完毕后。然后删除原来的rdb文件,将临时文件替换为新的rdb文件。(始终rdb文件只有一个)

    多进程处理bgsave。当触发bgsave命令时,redis首先会判断是否有其他进程在执行rdb文件操作,如果有其他正在运行的进程则直接返回。

    redis会fork一个和当前进程一模一样的子进程(文件描述符表,虚拟内存地址等等进程信息都是一致的)。并且也是共用同一块内存空间(防止内存数据量太大fork时就比较消耗资源),只有当父进程修改了内存中的数据时,此时子进程就会复制内存中的数据,不在和父进程共享同一块内存了。当子进程处理完rdb文件时,使用信号通知父进程,父进程就可以销毁这个子进程了。

redis生成快照操作触发时机:

1)配置文件中M时间内修改N次,自动触发。

2)通过shutdown命令正常停止redis服务。

3)redis进行主从复制的时候,主节点会自动生成rdb快照,然后把rdb快照传输给从节点。

自动触发

    在redis配置文件中,设置每隔多长时间/数据修改多少次就触发。

RDB特点

1)RDB是一个紧凑压缩的二进制文件,代表redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。

2)redis加载RDB文件恢复数据远远快于AOF的方式。(主要由于RDB是二进制文件)

3)RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要fork子进程,属于重量级操作,频繁执行成本过高。

4)RDB用特定的二进制文件保存,redis是有多个版本的,存在兼容性问题。

注意:

    rdb持久化机制不能做到实时持久化,每次持久化操作之间都会存在时间间隔。那么在时间间隔内,如果redis服务器宕机了,这段间隔时间内数据还没有生成rdb文件,那么服务器重启就会丢失数据。

AOF(append only file)

    AOF是一个文本文件,每次进行redis操作,都会被追加到文件末尾(直接追加操作redis命令)

注意:

    redis首先将内存中的数据写入内存中的缓冲区,积累一波后,再统一写入到硬盘中。(大大降低了写硬盘的次数)

    AOF每次将新的操作追加到文件末尾,属于顺序写入,效率相对较高。

缓冲区刷新策略

可配置值                                            说明
always命令写入aof_buf 后调用fsync同步,完成后返回
everysec命令写入aof_buf 后只执行write操作,不进行fsync,每秒由同步线程进行fsync
no命令写入aof_buf 后只执行write操作,由操作系统控制fsync频率

注意:

    上述缓冲区刷新策略由快到慢,那么数据可靠性由高到低,性能由低到高。配置文件中都是可修改的。

重写机制

    aof文件中存在一些冗余的记录(一些命令的中间状态也都保存了),redis重写机制针对aof文件进行整理,达到瘦身的效果。

    aof文件中数据只关注内存中最终状态,因此只需要将内存中的数据状态写入新aof文件,替换掉原来的就可以。

触发时机:

    手动触发:bgrewriteaof命令。

    自动触发:配置文件中进行配置(触发时aof最小文件大小,aof相比于上次文件大小增加的比例)

aof重写流程

    父进程会fork一个子进程,子进程将此刻内存数据按照aof格式写入到新aof文件。同时父进程继续处理命令,同时也写入到aof_rewrite_buf和旧aof文件中。

    当子进程将新aof文件写入完毕,使用信号通知父进程,然后将父进程写入的aof_rewrite_buf合并到新aof文件,然后替换掉旧aof文件。

问:为什么父进程需要写旧aof文件,不是最后要替换掉吗?

    如果子进程写新aof文件,突然进程挂了,那么aof文件就是不完整的。如果没有旧aof文件,数据就丢失了。

 

注意:

    重写只关注内存中的最终状态,不关注aof文件中原来有啥。

    如果,在执行bgrewriteaof的时候,已经在执行aof重写了,此时不会再次执行aof重写,直接返回了。

    如果,在执行bgrewriteaof的时候,redis正在生成rdb快照,此时redis的aof重写就会等待,等待rdb文件生成完毕,再执行aof重写。

混合持久化

    结合了aof和rdb机制的特点。

    按照aof的方式将每一步操作都记录到文件中。在触发aof重写机制后,就会把当前内存的状态按照rdb的二进制格式写入到文件中,后续再操作仍然是按照aof文本追加的方式写入文件。

注意

    当redis上同时存在aof和rdb文件时,以aof为主,rdb就被忽略了。

事务

    把多个操作打包到一起,要么全都执行,要么全都不执行。如果执行若干条命令,失败了,那就失败了,没有任何处理。(由于和mysql相比这里没有回滚操作,那么认为redis事务没有原子性)。

    不具备一致性:redis没有约束,也没有回滚机制。事务执行过程中如果某个修改操作失败,就会导致不一致的情况。

    不具备持久性:redis是内存数据库,数据存储在内存中的。虽然有持久化机制,但也是为了redis恢复数据,和这里没有关系。

    不涉及隔离性:redis是单线程处理请求命令,所有请求都是串行执行的,不涉及并发。

redis事务主要意义:

    就是为了打包命令,防止其他客户端命令插队。

注意:

    redis实现事务引入了队列(每个客户端都有一个)。开启事务的时候,客户端请求命令就会进入到这个队列,而不会立即执行,当提交事务的时候,redis才会打包一起按照顺序执行这些命令。主线程会把这些命令处理完,再处理其他客户端请求。

    redis如果按照集群模式部署,不支持事务。

事务操作命令

开启事务:MULTI

提交事务:EXEC

放弃当前事务:DISCARD

注意:

    当开启事务,并且客户端发送若干条命令后,如果redis服务重启,那么就会放弃当前的事务(DISCARD)。

WATCH

    监控某个key,是否在事务执行之前发生了改变。

    如果在事务执行时发现了某个key被其他客户端修改了,那么事务提交时就不会真正执行这条修改命令。

WATCH实现原理

    基于版本号机制实现类似“乐观锁”。预测锁竞争不是很激烈,即其他客户端在事务提交之前修改相同数据概率不是很大。

    当使用watch监控某个key时,会给这个key分配一个版本号,如果有其他客户端修改了这个key,则版本号会变大。当exec提交事务的时候就会判断,这个key版本号是否和之前watch记录的版本号一致。

    如果一致则说明key没有被修改过,就会正常执行事务中的命令。如果不一致则说明key被其他客户端修改过,就会直接丢弃事务中的操作,exec返回nil。

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

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

相关文章

【前端从0开始】HTML5+CSS3基础语法

html5发展 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定。 HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些 HTML5 支持 h5添加css hack,css zoom知识点 特性 新的特殊内容元素…

【洛谷】P2440 木材加工

原题链接:https://www.luogu.com.cn/problem/P2440 1. 题目描述 2. 思路分析 整体思路:二分答案 设置一个变量longest来记录最长木头的长度,sum记录切成的小段数量之和。 令左边界l0,右边界llongest。 写一个bool类型的check…

函数指针.

首先看一段代码&#xff1a; #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 输出结果&#xff1a; 输出的是两个地址&#xff0c;这两个地址是 test 函…

VMware 中Centos8的NAT网络设置

1、先将虚拟机设置为NAT模式 2、打开虚拟网络编辑器&#xff0c;记录以下信息 NAT设置&#xff1a;子网掩码、网关 DHCP设置&#xff1a;I P 范围 (自动时) 3、进入Centos8的网络设置页面&#xff0c;按照记录的信息进行配置 4、重载、重启网卡 nmcli c reload ensl60 n…

【位运算】算法实战

文章目录 一、算法原理常见的位运算总结 二、算法实战1. leetcode面试题01.01. 判断字符是否唯一2. leetcode268 丢失的数字3. leetcode371 两整数之和4. leetcode004 只出现一次的数字II5. leetcode面试题17.19. 消失的两个数字 三、总结 一、算法原理 计算机中的数据都以二进…

基础论文学习(5)——MAE

MAE&#xff1a;Masked Autoencoders Are Scalable Vision Learners Self-Supervised Learning step1&#xff1a;先用无标签数据集&#xff0c;把参数从一张白纸训练到初步预训练模型&#xff0c;可以得到数据的 Visual Representationstep2&#xff1a;再从初步成型&#x…

OpenCV基础知识(7)— 腐蚀与膨胀

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。腐蚀和膨胀是图像形态学中的两种核心操作&#xff0c;通过这两种操作可以清除或者强化图像中的细节。本节课就对OpenCV中的腐蚀和膨胀操作进行详细的介绍。&#x1f308; 前期回顾&#xff1a; OpenCV基础知识&#xff08;…

Web应用登录验证的几种方式

一、SessionCookie登录 传统的sessioncookie登录是一种有状态 的登录 1、传统的sessioncookie 流程 浏览器登录发送账号和密码&#xff0c;服务端查找数据库验证用户验证成功后&#xff0c;服务端把用户状态&#xff08;登录状态&#xff0c;角色&#xff0c;权限等信息&…

Vue2向Vue3过度核心技术生命周期

目录 1 Vue生命周期2 Vue生命周期钩子3 生命周期钩子小案例1.1 在created中发送数据1.2 在mounted中获取焦点 4 案例-小黑记账清单4.1 需求图示&#xff1a;4.2 需求分析3.思路分析4.代码准备 1 Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#…

【管理运筹学】第 6 章 | 运输问题(1,运输问题的数学模型及性质特点)

文章目录 引言一、运输问题的数学模型及特点1.1 运输问题的数学模型1.2 运输问题的特点1.3 运输问题的解 二、表上作业法写在最后 引言 在之前的学习过程中&#xff0c;我们接触的是较为一般性的线性规划问题。但是随着人们对运输——将人或物由一个空间位置移动到另一个空间位…

共享内存 windows和linux

服务端&#xff0c;即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…

基于秃鹰算法优化的BP神经网络(预测应用) - 附代码

基于秃鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于秃鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.秃鹰优化BP神经网络2.1 BP神经网络参数设置2.2 秃鹰算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

双指针算法实例4(盛最多水的容器)

题目&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不…

基于STM32的天然气煤气检测报警仿真设计(仿真+程序+讲解)

基于STM32的天然气煤气检测报警仿真设计 演示视频1.主要功能2.仿真3. 程序4. 资料清单&下载链接 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0081 演示视频 基于STM32的天然气煤气可燃气体检测报警仿真设计 1.主要…

python: pywin32 + cef 模仿 mdict 界面

pip install pywin32 ; pip install cefpython3 cefpython3-66.1-py2.py3-none-win_amd64.whl (69.0 MB) Successfully installed cefpython3-66.1 cd \Python37\Lib\site-packages\cefpython3\examples copy pywin32.py win_cef.py 用的图片在 \Python37\Lib\site-packages…

R语言如果列表中有列表,且每个子列表有一个向量:如何转变为仅仅一个列表里面含有向量

引言 有些时候&#xff0c;比如批量读取表格中的某一列的时候&#xff0c;最终你会得到列表里面装列表&#xff0c;且每个列表里面只有一个向量的情况。我们的目标是不要中间这一层列表&#xff0c;而是直接变成列表-向量这种简单的结构&#xff0c;如何完成呢。我觉得有很多方…

深度解析:Stable Diffusion中negative prompt是如何作用的?

Diffusion Models专栏文章汇总:入门与实战 前言:stable diffusion推理的时候可以用negative prompt(负面提示词)去除我们不想出现的元素,这种方法的背后原理是什么?如何用代码实现呢?这篇博客就深入探讨这个问题。 目录 从分类器引导技术开始说起

参考测试信号:吉布斯效应

吉布斯效应是一种信号处理中常见的现象&#xff0c;特别在信号的突变或跃变时会显现出来。它在信号的瞬时过渡中可能引起频谱中的振铃或震荡&#xff0c;从而导致频谱图中出现不期望的高频成分。这种现象主要发生在信号经过截断或窗口函数等非平滑操作时&#xff0c;例如信号的…

TouchGFX之移植

在前面篇幅的基础上移植TouchGFX 1.配置FreeRTOS 2.使用touchgfx需要打开CRC 3.配置TouchGFX 4.生成代码&#xff0c;工程目录下多了TouchGFX文件夹 5.打开TouchGFX Designer工程 6.放置box控件&#xff0c;将颜色设置为红色 7.运行模拟器&#xff0c;生成代码 8.打开keil工程&…

GPU版本pytorch(Cuda12.1)安装教程

我们通过Pytorch官网安装torch的时候&#xff0c;会发现常常由于网速问题安装不成功&#xff0c;下面提供一种简单的方法可以成功安装Cuda12.1&#xff0c;亲测有效。 目录 一、常规方法 二、有效方法 2.1 创建并激活虚拟环境 2.2 添加清华源 2.3 安装torch 一、常规方法…