Redis持久化机制与Redis事务

news2024/11/15 2:20:49

一、Redis 持久化机制

Redis 是个基于内存的数据库。那服务一旦宕机,内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作正在运行)且数据量很大情况下,从数据库恢复的话,会为数据库带来巨大的压力,进而导致程序相应缓慢。因此实现数据的持久化,避免从后端数据库中恢复数据,对于Redis 是十分必要的。

此外,Redis 可以通过创建快照来获得存储在内存里面的数据。创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用,其中 Redis 最常用的快照持久化机制分为两种,即 RDB 与 AOF。

1、Redis 持久化机制 RDB

RDB 持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上的数据库状态保存到 RDB 文件中,RDB 文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于RDB文件是保存在硬盘上的,所以即使 Redis 崩溃或者退出,只要 RDB 文件存在,就可以用它来恢复还原数据库的状态。

可以通过 SAVE 或者 BGSAVE 来生成 RDB 文件:

  • SAVE 命令会阻塞 Redis 进程,直到 RDB 文件生成完毕,在进程阻塞期间,redis 不能处理任何命令请求,这显然是不合适的。
  • BGSAV E则是会 for k出一个子进程,然后由子进程去负责生成 RDB 文件,父进程还可以继续处理命令请求,不会阻塞进程。

2、Redis 持久化机制 AOF

AOF 和 RDB 不同,AOF 是通过保存 redis服务器所执行的写命令来记录数据库状态的。

AOF 通过追加、写入、同步三个步骤来实现持久化机制。

  1. 当 AOF 持久化处于激活状态,服务器执行完写命令之后,写命令将会被追加 append 到 aof_buf 缓冲区的末尾
  2. 在服务器每结束一个事件循环之前,将会调用 flushAppendOnlyFile 函数决定是否要将 aof_buf 的内容保存到AOF文件中,可以通过配置 appendfsync 来决定。
    • always:aof_buf 内容写入并同步到 AOF 文件
    • everysec:将 aof_buf 中内容写入到 AOF 文件,如果上次同步 AOF 文件时间距离现在超过1秒,则再次对 AOF 文件进行同步
    • no:将 aof_buf 内容写入AOF文件,但是并不对 AOF 文件进行同步,同步时间由操作系统决定
  3. 如果不设置,默认选项将会是 everysec,因为 always 来说虽然最安全(只会丢失一次事件循环的写命令),但是性能较差,而 everysec 模式只不过会可能丢失1秒钟的数据,而 no 模式的效率和 everysec 相仿,但是会丢失上次同步 AOF 文件之后的所有写命令数据。

3、Redis 持久化机制 RDB 与 AOF 的区别

  • 实现方式:RDB 持久化是通过将某个时间点 Redis 服务器存储的数据保存到 RDB 文件中来实现持久化的;AOF持久化是通过将 Redis 服务器执行的所有写命令保存到 AOF 文件中来实现持久化的;
  • 文件体积:由上述实现方式可知,RDB 持久化记录的是结果,AOF 持久化记录的是过程,所以 AOF 持久化生成的 AOF 文件会有体积越来越大的问题,Redis 提供了 AOF 重写功能来减小 AOF 文件体积;
  • 安全性:AOF 持久化的安全性要比 RDB 持久化的安全性高,即如果发生机器故障,AOF 持久化要比 RDB 持久化丢失的数据要少。因为 RDB 持久化会丢失上次 RDB 持久化后写入的数据,而 AOF 持久化最多丢失1s之内写入的数据(使用默认everysec 配置的话);
  • 优先级:由于上述的安全性问题,如果 Redis 服务器开启了 AOF 持久化功能,Redis 服务器在启动时会使用 AOF 文件来还原数据,如果 Redis 服务器没有开启 AOF 持久化功能,Redis 服务器在启动时会使用 RDB 文件来还原数据,所以 AOF 文件的优先级比 RDB 文件的优先级高。

-

RDB

AOF

启动优先级

文件大小

恢复速度

数据安全性

丢数据

根据策略决定


二、Redis 事务

1、Redis 事务

Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,并且在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。事务的执行过程如下:

  1. 服务端收到客户端请求,事务以 MULTI 开始
  2. 如果客户端正处于事务状态,则会把事务放入队列同时返回给客户端 QUEUED,反之则直接执行这个命令
  3. 当收到客户端 EXEC 命令时,WATCH 命令监视整个事务中的 key 是否有被修改,如果有则返回空回复到客户端表示失败,否则 Redis 会遍历整个事务队列,执行队列中保存的所有命令,最后返回结果给客户端

WATCH 的机制本身是一个 CAS 的机制,被监视的 key 会被保存到一个链表中,如果某个 key 被修改,那么 REDIS_DIRTY_CAS 标志将会被打开,这时服务器会拒绝执行事务。

2、Redis 事务相关命令

Redis 通过 MULTI、EXEC、DISCARD、WATCH 实现事务功能:

# MULTI 开始事务

> multi
OK

复制

MULTI 命令将 Redis 中的 Redis_multi 选项打开,让客户端从非事务状态变为事务状态

# 命令入队

> set bookName "LiZhengi"
QUEUED
> get bookName
QUEUED
> sadd tag "LiZhengi" "Old Book"
QUEUED
> smembers tag
QUEUED

复制

在 Redsi 进入事务状态后,Redis 命令并不是立即执行的,而是进入一个先进先出的事务队列。其中返回 QUEUED 表示这个命令已经入了事务队列。

# exec 提交事物

> exec
1) OK
2) "LiZhengi"
3) (integer) 2
4) 1) "LiZhengi"
   2) "Old Book"

复制

可以看到:当执行 exec 命令时,Redis 根据客户端所保存的事务队列,事务队列中的命令以先进先出的方式执行。当 exec 命令执行完毕时,Redis 会将结果保存到一个回复队列,并将回复队列返回给客户端。客户端从事务状态退出,一个事务执行完毕。

# discard 取消事务

> multi
OK
> set bookName "LiZhengi"
QUEUED
> discard
OK
> get bookName
(nil)

复制

discard 取消一个事务的命令,表示这个事务被取消。客户端从事务状态退出,回到非事务状态,Redis_multi 选项关闭。

# watch 命令

watch 命令在事务开始之前监视任意数量的键:当调用 exce 命令执行事务时,如果任意一个被监视的键已经被其他客户端修改了,那么整个事务不再执行,直接返回失败。

3、关于 Pipeline

管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能。

通常情况下 Redis 是单行执行的,客户端先向服务器发送请求,服务端接收并处理请求后再把结果返回给客户端,这种处理模式在非频繁请求时不会有任何问题。

但如果出现集中大批量的请求时,因为每个请求都要经历先请求再响应的过程,这就会造成网络资源浪费,此时就需要管道技术来把所有的命令整合一次发给服务端,再一次响应给客户端,这样就能大大的提升了 Redis 的响应速度。

管道技术解决了多个命令集中请求时造成网络资源浪费的问题,加快了 Redis 的响应速度,让 Redis 拥有更高的运行速度。但要注意的一点是,管道技术本质上是客户端提供的功能,而非 Redis 服务器端的功能。

Pipeline 与 事务相比:

  • pipeline 是客户端的行为,对于服务器来说是透明的,可以认为服务器无法区分客户端发送来的查询命令是以普通命令的形式还是以 pipeline 的形式发送到服务器的;
  • 而事务则是实现在服务器端的行为,用户执行 MULTI 命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的查询命令不会被真的执行,而是被服务器缓存起来,直到用户执行 EXEC 命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。

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

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

相关文章

Python打包,嵌入式方式打包,而且是官方推荐的打包方式-Python嵌入式打包真的不如pyinstaller吗?

嵌入式打包: 解释: 用嵌入式版本的python解释器进行打包程序,python有嵌入式版本,而且这个嵌入式版本的解释器大小很小,可以很好的省磁盘空间!!! 打包步骤: 1、从pyt…

【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米。还有类似QQ附近的人,我们能看到附近的人距离我们有多少米。 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务系统呢。 在去了解基于位置的附近服务之前,我…

RSA算法

什么是RSA算法? 1976年以前,所有的加密方法都是同一种模式: 甲方选择某一种加密规则,对信息进行加密; 乙方使用同一种规则,对信息进行解密。 由于加密和解密使用同样规则(简称"密钥"&…

C语言/C++ 之 打飞机游戏

【项目简介】 1、设计思想:本项目主要是为了实现打飞机游戏,主要包括5个函数模块,和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo;、wu_cao_zuo();、show();、main();等。项目完成过程中主要运用了C/C中的输入输…

蛋黄肉粽子

蛋黄肉粽子 一、蛋黄肉粽子 作为中国的传统美食之一,蛋黄肉粽子是端午节期间必不可少的特色食品。 我在今年的端午节期间品尝了这种美食,不仅让我感受到了它的美味,也让我领略到了它背后的历史和文化底蕴。 一、蛋黄肉粽子 首先,就…

第三方库介绍——nanomsg(高性能通信库)

一、nanomsg介绍 NanoMsg是一个Socket的通讯库,使用C语言编写实现的,这样就可以适用于多种操作系统,而且几乎不需要什么依赖,可扩展并且能易于使用。Nanomsg提供了几种常见的通信模式 ( 也称为“可扩展性协议” &#…

C++ 第一弹入门基础

目录 目录 1.关键字 2.命名空间 3.标准IO输入输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 1.关键字 c98的关键字一共有63个 在之后用的时候都会再次详细介绍 2.命名空间 2.1什么是命名空间,为什么要有他? 在c中为了避免相同名字的变量&am…

torchvision.utils.save_image()保存tensor显示图片异常问题解决

用torchvision.utils.save_image()保存图片时出现异常 有些像素点会显示为全黑(灰度图),如下图所示,第一张和第三张图 刚开始以为是图像数据分布范围的问题,在保存之前输出图像tensor的最大max和最小min值,…

【Python 基础篇】Python 模块与包

文章目录 引言一、模块与包概述二、模块的导入和使用三、包的组织和导入四、实际应用场景五、总结 引言 在Python编程中,模块和包是组织和复用代码的重要工具。随着项目规模的增长,将代码按照功能模块化并组织成包,可以提高代码的可读性、可…

吴恩达ChatGPT《Building Systems with the ChatGPT API》笔记

1. 课程介绍 使用ChatGPT搭建端到端的LLM系统 本课程将演示使用ChatGPT API搭建一个端到端的客户服务辅助系统,其将多个调用链接到语言模型,根据前一个调用的输出来决定使用不同的指令,有时也可以从外部来源查找信息。 课程链接&#xff1a…

设计模式之桥接模式笔记

设计模式之桥接模式笔记 说明Bridge(桥接)目录桥接模式示例类图视频文件接口avi视频文件类rmvb视频文件类抽象的操作系统类windows类mac类测试类 说明 记录下学习设计模式-桥接模式的写法。JDK使用版本为1.8版本。 Bridge(桥接) 意图:将抽象部分与其实现部分分离&#xff0c…

用微分方程描述的连续时间滤波器举例

用微分方程描述的连续时间滤波器举例 在许多应用中,频率选择性滤波器是用线性常系数微分或差分方程描述的线性时不变系统来实现的。这有许多理由,例如很多具有滤波作用的物理系统都是由微分或差分方程表征的。这方面的一个很好的例子就是在后续将研究的汽…

消息中间件相关知识简介

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ&am…

Python 基础(十五):模块

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、什么是模块二、自定义模块三、引用其它模块3.1、使用 import 引用模块3.2、使用 f…

揭秘Java 8的新特性:Stream API的使用和实践

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 1. 集合处理数据的弊端 2. Stream流式思想概述…

VN8911/VN8912(A)/VN8914/VN8910(A)上安装驱动

问题: 如何在 VN8911、VN8912(A) 或 VN8914 设备上安装驱动程序? 背景: VN8911、VN8912(A) 或 VN8914 设备 [下面概括为 VN8900 系列,不包括 VN8910(A)] 与 CANoe 一起使用时作为分布式实时系统运行 [参见下面的 CANoe 11.0 和 V…

vue插槽概念解释

官方文档 https://cn.vuejs.org/guide/introduction.html 什么是插槽 在 Vue.js 中,插槽(Slots)是一项非常有效的功能,它允许我们在组件中预留一个占位符,供父组件插入自定义的内容。 具体来说,当一个组件…

Linux和Shell:开源力量与命令行之美

目录 一、概述二、Linux的简单介绍三、Shell的简单介绍四、Linux和Shell的应用领域五、Shell编程结语: 一、概述 Linux和Shell是开源世界中不可或缺的两个重要组成部分。Linux作为一种自由和开放的操作系统,以其稳定性、安全性和可定制性而备受推崇。而S…

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计 0. NoC多核片上网络生成器ProNoCProNoC的功能实现 1. 生成一个叫做Mor1kx SoC的单个Tile(包含NI网络接口)1.1 打开ProNoC用于生成Tile的GUI界面1.2 为Tile添加时钟…

Python基础篇(四):基本数据类型的学习和示例

Python基础篇(三):基本语句的示例和说明 基本数据类型的学习和操作 1. 数值类型1.1 整数(int)1.2 浮点数(float)1.3 复数(complex) 2. 字符串类型2.1 字符串的定义2.2 转义字符2.3 多行字符串2…