Redis系列:Redis持久化机制与Redis事务

news2024/12/23 14:01:56

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

本篇内容包括:Redis 持久化机制(即 RDB、AOF 和 二者的区别)、Redis 事务及相关命令。


文章目录

    • 一、Redis 持久化机制
        • 1、Redis 持久化机制 RDB
        • 2、Redis 持久化机制 AOF
        • 3、Redis 持久化机制 RDB 与 AOF 的区别
    • 二、Redis 事务
        • 1、Redis 事务
        • 2、Redis 事务相关命令
        • 3、关于 Pipeline


一、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机制

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 文件的优先级高。
-RDBAOF
启动优先级
文件大小
恢复速度
数据安全性丢数据根据策略决定

二、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/5153.html

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

相关文章

LeetCode刷题记录01

1704判断字符串的两半是否相似序题目我的思路我的代码提交结果其他解简述思路提交结果总结序 我的日常碎碎念:今天下班在看综艺,看到群里班长开了个会议,于是决定开始学习,他说今天的每日一题好简单,让我也去刷一下。嗯…

数组的定义与使用

文章目录数组的基本概念为什么要使用数组什么是数组数组的创建及初始化数组的创建数组的初始化数组的使用数组中元素的访问遍历数组数组是引用类型基本数据类型与引用类型变量的区别认识null数组的应用场景保存数据作为函数的参数参数传基本数据类型参数传数组类型作为函数的返…

TFN T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪 OTDR E1 PRI V.35/V.24 光功率计一体机

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐,说的功能一个比一个强,…

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器 1 原理图 2 开发流程 首先我们先打开安装好的Vivado软件 创建一个文件 选择你的开发板 创建一个源文件 现在我们就可以根据原理使用Verilog代码实验这个功能了 module mux2( //端口列表a,b,sel,out);//交代端口类…

RabbitMQ第二个实操小案例——WorkQueue

文章目录RabbitMQ第二个实操小案例——WorkQueueRabbitMQ第二个实操小案例——WorkQueue 讲第二个案例之前,我们先看下前面第一个案例的模型: 可以看到,我们只有一个发布者和一个消费者,通过Queue队列,实现最简单的消…

02 【nodejs开发环境安装】

02 【nodejs开发环境安装】 1.版本介绍 在命令窗口中输入 node -v 可以查看版本0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性(比4.x多些),属于过渡产品,现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特…

e智团队实验室项目-第三周-经典的卷积神经网络的学习

e智团队实验室项目-第三周-卷积神经网络的学习 赵雅玲 *, 张钊* , 李锦玉,迟梦瑶,贾小云,赵尉,潘玉,刘立赛,祝大双,李月,曹海艳, (淮北师范大学计算机科学与技术学院&am…

【树莓派不吃灰】基础篇⑱ 从0到1搭建docker环境,顺便安装一下emqx MQTT Broker、HomeAssistant、portainer

目录1. 前言2. 搭建docker环境3. docker简介3.1 docker解决什么问题?3.2 docker VS vm虚拟机3.2.1 vm虚拟机3.2.2 docker3.3 docker如何解决问题?3.4 docker运行架构3.4.1 镜像 : image3.4.2 容器 : container3.4.3 仓库 : repository3.5 国内镜像加速3.…

python easygui怎么修改默认按钮名字

1.执行以下代码找到easygui安装位置 import easyguiprint(easygui.__file__)2.打开上述路径下boxes文件夹下需要修改的组件 如此时想要修改选项栏的默认按钮名字 则打开choice_box.py文件 执行如下图 可以看到有Cancel、SelectALL、ClearALL、OK四个默认按钮,可否…

Linux下动静态库的制作与使用

学习导航一、关于动静态库的基本认识二、设计库的工程师角度(1)制作静态库(2)制作动态库二、使用库的用户角度(1)使用静态库(2)使用动态库三、理解的角度一、关于动静态库的基本认识 1.静态库 静态库以 .a 作为文件后缀程序在编译链接的时候,将静态库的代码拷贝到…

[TCP/IP] Linux 搭建服务器局域网

文章目录[TCP/IP] Linux 搭建服务器局域网1. 使用python内置库http.server2. 使用Http-Server[TCP/IP] Linux 搭建服务器局域网 1. 使用python内置库http.server python3: http.server 命令行启动: # python 3 python -m http.server 8000 # python 2 python -m S…

ZYNQ_FPGA_SPI通信协议多种实现方式

文章目录PLPSSPIGPIOAXI-GPIOAXI-Quad-SPI(待测试)本文记录一下在使用AD9363中的SPI通信问题,同时针对在ZYNQ系列开发板上实现SPI的方法做一个总结。ZYNQ系列包含了PL端和PS端,因为本科阶段有一定的ARM的开发经验,便想…

2022年,软件测试已经不吃香了吗?

最近因为疫情等各种原因,大厂裁员,失业等等频频受到关注。 不解释,确实存在,各行各业都很难,但是,说软件测试行业不吃香,我还真不认同(不是为培训机构说好话,大环境不好…

JVM从入门到入魔,这份JVM必知必会的完整版带你彻底玩懂JVM

市面上各类 JVM 相关的资料虽多如牛毛,但是明显都很难让大家系统性地学明白,同时一线大厂技术面试现在 JVM 知识也是必考科目。 在大厂摸爬滚打 10 多年的 Java 高级技术专家全面梳理了系统化学习 JVM 的知识和经验,从入门到入魔&#xff0c…

位运算常用技巧以及练习

几个有趣的操作 利用或操作|和空格将英文字符转换成小写 // 可以变成小写i : a | fmt.Printf("%c\n", i)j : A | fmt.Printf("%c\n", j)利用与操作&和下划线把英文字符转换成大写 // 可以变成大写m : b & _n : B & _fmt.Printf("%c\n…

大数据ClickHouse进阶(二十七):ClickHouse服务监控

文章目录 ClickHouse服务监控 一、系统表 1、metrics 2、events 3、asynchronous_metrics

【爬虫系列】Python 爬虫入门(2)

接上篇,继续梳理 Python 爬虫入门的知识点。这里将重点说明,如何识别网站反爬虫机制及应对策略,使用 Selenium 模拟浏览器操作等内容,干货满满,一起学习和成长吧。 1、识别反爬虫机制及应对策略 1.1 测试网站是否开启…

项目中如何配置 Maven 为国内源

目录 1. 创建出一个 Maven 项目 2. 打开项目配置界面, 检查并配置国内源 2.1 打开配置界面 (当前项目界面和新项目配置界面) 2.2 搜索 "Maven" 2.3 设置 setting.xml (给此 xml 中添加国内源) 2.4 把上面的步骤 (2.1~2.3) 在新项目的配置界面中重新配置一遍. …

【MySQL】MySQL事务隔离机制与实现原理详解(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

加权黑猩猩优化算法(WChOA)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …