Redis 事务与数据持久化

news2024/9/19 18:07:04

 

目录

一、Redis 事务

 1.1 事务本质

 1.2 数据库事务与redis事务

 1.2.1 数据库事务

 1.2.2 Redis事务

 1.2.2.1 两种错误不同处理方式

 1)代码语法错误(编译时异常)

 2)代码逻辑错误(运行时错误)

1.2.2.2 这种做法的优点:

 1.3 事务监控

二、数据持久化 

2.1 RDB持久化

2.1.1 工作原理

2.1.2 触发机制

2.1.2.1 手动触发

 1)save

 2)bgsave

bgsave和save对比:

 2.1.2.2 自动触发

 触发条件:

 2.1.3 RDB优缺点

 2.1.3.1 优点:

2.1.3.2 缺点:

 2.2 AOF持久化

 2.2.1 AOF配置项

 2.2.2 AOF 重写机制

 2.2.3 触发方式

 2.2.3.1 手动触发

 2.2.3.2 自动触发

 2.2.4 AOF的优缺点

 2.2.4.1 优点

 1)数据安全

 2)解决数据一致性问题。

 3)AOF 机制的 rewrite 模式。

 2.2.4.2 缺点

 1)AOF 文件比 RDB 文件大,且恢复速度慢。

 2)数据集大的时候,比 rdb 启动效率低。

 2.3 rdb与aof对比

2.4 总结


一、Redis 事务

 1.1 事务本质

一组命令的集合

 1.2 数据库事务与redis事务

 1.2.1 数据库事务

数据库事务通过ACID(原子性、一致性、隔离性、持久性)来保证。

数据库中除查询操作以外,插入(Insert)、删除(Delete)和更新(Update)这三种操作都会对数据造成影响,因为事务处理能够保证一系列操作可以完全地执行或者完全不执行,因此在一个事务被提交以后,该事务中的任何一条SQL语句在被执行的时候,都会生成一条撤销日志(Undo Log)。

 1.2.2 Redis事务

redis事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。

Redis中一个事务从开始到执行会经历开始事务(muiti)命令入队执行事务(exec)三个阶段,事务中的命令在加入时都没有被执行,直到提交时才会开始执行(Exec)一次性完成。

 1.2.2.1 两种错误不同处理方式

 1)代码语法错误(编译时异常)

发生代码语法错误时,所有命令都不执行。

 2)代码逻辑错误(运行时错误)

发生代码逻辑错误时,其他命令可以正常执行 (该点不保证事务的原子性)

为什么redis不支持回滚来保证原子性

1.2.2.2 这种做法的优点:

  • Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
  • 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

鉴于没有任何机制能避免程序员自己造成的错误, 并且这类错误通常不会在生产环境中出现, 所以 Redis 选择了更简单、更快速的无回滚方式来处理事务。

 1.3 事务监控

redis使用watch key监控指定数据,相当于加乐观锁

watch保证事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。

watch执行流程:

二、数据持久化 

Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题Redis供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失两种持久化方式:快照(RDB文件)追加式文件(AOF文件),下面分别为大家介绍两种方式的原理。

  • RDB持久化方式会在一个特定的间隔保存那个时间点的数据快照。
  • AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。
  • Redis的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。
  • 两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据。

2.1 RDB持久化

RDB持久化产生的文件是一个经过压缩的二进制文件,这个文件可以被保存到硬盘中,可以通过这个文件还原数据库的状态,它可以手动执行,也可以在redis.conf配置文件中配置,定时执行。

2.1.1 工作原理

在进行RDB时,redis的主进程不会做io操作,会fork一个子进程来完成该操作:

1)Redis 调用forks。同时拥有父进程和子进程。

2)子进程将数据集写入到一个临时 RDB 文件中。

3)当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益(因为是使用子进程进行写操作,而父进程依然可以接收来自客户端的请求)

2.1.2 触发机制

在Redis中RDB持久化的触发分为两种:自己手动触发与自动触发。

2.1.2.1 手动触发

 1)save

save命令是同步的命令,会占用主进程,会造成阻塞,阻塞所有客户端的请求

 2)bgsave

bgsave是异步进行,进行持久化的时候,redis还可以将继续响应客户端请求

bgsave和save对比:
命令savebgsave
IO类型同步异步
阻塞是(阻塞发生在fock(),通常非常快)
复杂度O(n)O(n)
优点不会消耗额外的内存不阻塞客户端命令
缺点阻塞客户端命令需要fock子进程,消耗内存

 2.1.2.2 自动触发

 触发条件:

save自动触发配置,见下面配置,满足m秒内修改n次key,触发rdb

# 时间策略   save m n m秒内修改n次key,触发rdb
save 900 1
save 300 10
save 60 10000

# 文件名称
dbfilename dump.rdb

# 文件保存路径
dir /home/work/app/redis/data/

# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes

# 是否压缩
rdbcompression yes

# 导入时是否检查
rdbchecksum yes

1)从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发bgsave命令;

2)执行flushall命令,会触发rdb

3)退出redis,且没有开启aof时

 2.1.3 RDB优缺点

 2.1.3.1 优点:

1)RDB 的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;

2)RDB 对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行 Redis 服务恢复;

3)RDB 可以更大程度的提高 Redis 的运行速度,因为每次持久化时 Redis 主进程都会 fork() 一个子进程,进行数据持久化到磁盘,Redis 主进程并不会执行磁盘 I/O 等操作;

4)与 AOF 格式的文件相比,RDB 文件可以更快的重启。

2.1.3.2 缺点:

1)因为 RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被意外终止了,则会丢失一段时间内的 Redis 数据。

2)RDB 需要经常 fork() 才能使用子进程将其持久化在磁盘上。如果数据集很大,fork() 可能很耗时,并且如果数据集很大且 CPU 性能不佳,则可能导致 Redis 停止为客户端服务几毫秒甚至一秒钟。

 2.2 AOF持久化

以日志的形式来记录每个写的操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

 2.2.1 AOF配置项

# 默认不开启aof  而是使用rdb的方式
appendonly no

# 默认文件名
appendfilename "appendonly.aof"

# 每次修改都会sync 消耗性能
# appendfsync always
# 每秒执行一次 sync 可能会丢失这一秒的数据
appendfsync everysec
# 不执行 sync ,这时候操作系统自己同步数据,速度最快
# appendfsync no 

AOF的整个流程大体来看可以分为两步,一步是命令的实时写入(如果是appendfsync everysec 配置,会有1s损耗),第二步是对aof文件的重写。

 2.2.2 AOF 重写机制

随着Redis的运行,AOF的日志会越来越长,如果实例宕机重启,那么重放整个AOF将会变得十分耗时,而在日志记录中,又有很多无意义的记录,比如我现在将一个数据 incr一千次,那么就不需要去记录这1000次修改,只需要记录最后的值即可。所以就需要进行 AOF 重写。

Redis 提供了bgrewriteaof指令用于对AOF日志进行重写,该指令运行时会开辟一个子进程对内存进行遍历,然后将其转换为一系列的 Redis 的操作指令,再序列化到一个日志文件中。完成后再替换原有的AOF文件,至此完成。

同样的也可以在redis.config中对重写机制的触发进行配置:

通过将no-appendfsync-on-rewrite设置为yes,开启重写机制;auto-aof-rewrite-percentage 100意为比上次从写后文件大小增长了100%再次触发重写;

auto-aof-rewrite-min-size 64mb意为当文件至少要达到64mb才会触发制动重写。

 2.2.3 触发方式

在Redis中AOF持久化的触发也分为两种:自己手动触发与自动触发。

 2.2.3.1 手动触发

bgrewriteaof

 2.2.3.2 自动触发

就是根据配置规则来触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系。

 2.2.4 AOF的优缺点

 2.2.4.1 优点

 1)数据安全

aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。

 2)解决数据一致性问题。

通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

 3)AOF 机制的 rewrite 模式。

AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

 2.2.4.2 缺点

 1)AOF 文件比 RDB 文件大,且恢复速度慢。
 2)数据集大的时候,比 rdb 启动效率低。

 2.3 rdb与aof对比

比较项RDBAOF
启动优先级
体积
恢复速度
数据安全性性丢数据根据策略决定

2.4 总结

RDB基于快照方式在一个特定的间隔保存那个时间点的数据,备份数据相对较小,恢复速度较块,但是可能会发生数据丢失;AOF持久化方式则会记录每一个服务器收到的写操作,备份文件体积较大,恢复速度较慢,但是这种方式制定一定的策略,不会丢失数据,相对来说数据安全性要比RDB高。在真实的企业生产环境中,Redis数据备份策略,一般是同时开启RDB和AOF两种备份方式,尽可能提高企业安全性的同时,也可以针对某个时间点基于数据快照快速恢复数据。

好了,本期Redis内容就分享到这,如果觉得本文对您有帮助,欢迎点赞+关注!

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

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

相关文章

线性代数行列式的几何含义

行列式可以看做是一系列列向量的排列,并且每个列向量的分量可以理解为其对应标准正交基下的坐标。 行列式有非常直观的几何意义,例如: 二维行列式按列向量排列依次是 a \mathbf{a} a和 b \mathbf{b} b,可以表示 a \mathbf{a} a和…

目标检测mAP

概述 AP (Average precision) is a popular metric in measuring the accuracy of object detectors like Faster R-CNN, SSD, etc. Average precision computes the average precision value for recall value over 0 to 1. It sounds complicated but actually pretty simple…

安卓热修系列-插件资源冲突解决方案

作者:37手游移动客户端团队 背景 在做插件化过程中,宿主需要用到插件的资源,涉及到加载插件的资源; 因为插件是以apk的方式存在的,所以插件的ID和宿主的ID可能导致重复; 为了解决这个问题,需…

[游戏开发][Unity]点击Play按钮卡顿特别久

一般小工程不会遇到这个问题,我在公司接手了几个老项目,都遇到了这个问题。每次Play卡顿几分钟甚至十几分钟,很是头疼。

DL学习11-nin-mnist

对于使用卷积神经网络加全连接层的结构而言,对于全连接的参数的巨大了,对于简单的任务容易造成过拟合,且会增加模型的额外开销,例如alexnet,vgg等,全连接层的开销会随着参数的增加而爆炸式增长。 nin旨在使…

ELK增量同步数据【MySql->ES】

一、前置条件 1. linux,已经搭建好的logstasheskibana【系列版本7.0X】,es 的plugs中安装ik分词器 ES版本: Logstash版本: (以上部署,都是运维同事搞的,我不会部署,同事给力&#…

动态SLAM论文(3) — Detect-SLAM: Making Object Detection and SLAM Mutually Beneficial

目录 1 Introduction 2 Related Work 3 Detect-SLAM 3.1 移动物体去除 3.2 Mapping Objects 3.3 增强SLAM检测器 4 实验 4.1 动态环境下的鲁棒SLAM 4.2. 提升检测性能 5 结论 Abstract:近年来,在SLAM和目标检测方面取得了显著进展,…

使用python sdk添加删除阿里云pvc路由

1. 前言 由于线路供应商sdwan存在单点问题,需要实现线路高可用解决方案,需要设计自动切换阿里云vpc路由解决方案。通过阿里云文档了解,可通过阿里云专有网络Python SDK,通过sdk实现创建、删除、查询等vpc网络相关操作&#xff08…

如何与德科斯米尔Draexlmaier 建立 EDI 连接?

德科斯米尔Draexlmaier(以下简称为DRX)是一家总部位于德国的汽车零部件供应商和系统集成商,如今已成为全球领先的汽车内部装饰系统、电气和电子系统、电缆技术以及储能系统的制造商之一。EDI 帮助DRX与其交易伙伴之间实现信息流的一致性、无误…

CHATGPT使用笔记

CHATGPT是帮你做事,而不是替你做事 1、联网插件: 使用Webpilot插件联网时还可以同时使用其它两种插件(一次可以同时使用三个插件),而使用Web Browsing插件功能联网时无法使用插件功能(联网功能和插件只能…

SpringBoot2+Vue2实战(八)文件上传实现

一、文件上传 创建数据库表 Files import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;Data TableName("sys_file") public cl…

18.RocketMQ中消息重复的场景和幂等处理

highlight: arduino-light 消息重复的场景 发送消息异常,重试发送导致消息重复★ 当一条消息已被成功发送到服务端并完成持久化。此时出现网络闪断或者客户端宕机,导致服务端对生产者的确认应答失败。生产者发送消息到mq时发送成功未获取到响应,然后生产者进行消息发…

信号链噪声分析18

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 到目前为止,我们考虑的是基带采样情况,即所有目标信号均位于第一奈奎斯特区内。 图 显示了另外一种情况,其中采样信号频带局限于第一奈奎斯…

5.8.1 TCP概述

5.8.1 TCP概述 TCP是在Internet中TCP/IP协议家族中最为重要的协议之一,因特网中各种网络特性参差不齐,所以必须要有一个功能很强的互联网可靠传输协议的要求,TCP特点要与UDP特点对比来看。 UDP特点TCP特点无连接面向连接不可靠的服务可靠的…

一文详解!自动化测试如何管理测试数据

目录 前言 脚本与数据捆绑 配置文件 测试文件 数据库管理 数据平台 综述 前言 测试数据管理是自动化测试中非常重要的一环,它涉及到数据的创建、存储、维护和管理。 在之前的自动化测试框架相关文章中,无论是接口自动化还是UI自动化&#xff0c…

机器学习-支持向量机SVM

文章目录 前言1 支持向量机1.1 数据集示例11.2 带有高斯核的SVM1.2.1 高斯核1.2.2 数据集示例21.2.3 数据集示例3 2 垃圾邮件分类2.1 邮件预处理2.2 训练SVM进行垃圾邮件分类 前言 在本练习中,我们将使用支持向量机(SVM)来构建垃圾邮件分类器…

机器学习基础之《概述》

一、机器学习与人工智能、深度学习 1、机器学习是人工智能的一个实现途径 2、深度学习是机器学习的一个方法发展而来 二、统计学习和机器学习 实际机器学习在上世纪80年代已经出现,搞统计的 机器学习中有一个方法,叫人工神经网络,发展成深度…

高压线路距离保护程序逻辑原理(六)

(三)振荡与短路故障的区分 在系统发生振荡时,又发生短路故障的机率虽然不多,但万一发生应要求保护能可靠地动作于跳闸。这就要求保护能很好地区分振荡和短路故障。但是在常规距离保护中,对振荡闭锁后再发生故…

【机器学习】比较全面的XGBoost算法讲解

本文是《机器学习入门基础》(黄海广著)的第十章的部分内容。 XGBoost算法 XGBoost是2014年2月由华盛顿大学的博士生陈天奇发明的基于梯度提升算法(GBDT)的机器学习算法,其算法不但具有优良的学习效果,而且训练速度高效&#xff0c…

【软件测试】测试的分类

目录 测试的分类 1.按测试对像划分 ⭐1.界面测试 2.可靠性测试 3.容错性测试 4.文档测试 ⭐5.兼容性测试: ⭐6.易用性测试: ⭐7.安装卸载测试 ⭐8. 安全测试: ⭐9.性能测试 10.内存泄漏测试 2.按是否查看代码划分 1.黑盒测试(…