Redis 事务、持久化、复制原理分析
Redis 事务、持久化、复制原理分析
- 一、Redis 简介
- 1.1 Redis
- 1.2 Redis 事务
- 二、Redis 事务机制
- 2.1 事务基本概念
- 2.2 Redis 事务操作
- 2.2.1 开启事务
- 2.2.2 批量执行命令
- 2.2.3 事务提交与回滚
- 三、Redis 持久化机制
- 3.1 持久化机制基本概念
- 3.2 Redis 持久化方案
- 3.2.1 RDB 持久化
- 3.2.2 AOF 持久化
- 四、Redis复制原理
- 4.1 复制原理基本概念
- 4.2 Redis复制模式
- 4.2.1 主从复制
- 4.2.2 哨兵模式
- 4.2.3 集群模式
一、Redis 简介
1.1 Redis
Redis是一种高性能的键值存储数据库,同时也是一种基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
1.2 Redis 事务
Redis的事务机制提供了一种原子性地执行多个命令的方式,在同时发生多个 Redis 命令时,可以使用事务来确保它们都会被执行。
Redis的持久化机制可以让Redis在重启后将数据恢复到上一次保存点。Redis支持两种不同的持久化方式:RDB 和 AOF。
Redis的复制机制(Master-Slave Replication)可以让 Redis 数据库达到高可用、负载均衡以及数据容灾备份的目的。
二、Redis 事务机制
2.1 事务基本概念
在 Redis 中,事务是指一个队列上的一批命令。事务内的所有命令都会被序列化并按顺序执行。事务执行期间,服务器不会中断事务而是依次执行各条命令。
如果事务过程中出现错误,例如某个命令执行失败,那么 Redis 不会回滚整个事务,而是会继续执行后面的命令,直到所有命令都被执行完毕。
2.2 Redis 事务操作
Redis 的事务操作可以通过multi、exec、discard三个命令来完成一个事务的执行。
2.2.1 开启事务
开启一个事务,可以通过multi命令来将Redis客户端设置为“事务模式”。在“事务模式”的状态下数据不会被立即执行,而是被缓存在 Redis 服务器的事务队列里。
Jedis jedis = new Jedis("localhost", 6379);
jedis.multi();//开启事务
2.2.2 批量执行命令
高效地执行一批命令可以使用“批量提交”方式,即将多条Redis命令一次性发送给服务端。将多个Redis命令放到multi和exec之间,并且它们以先进先出的队列形式被存储在内存里。例如:
Jedis jedis = new Jedis("localhost", 6379);
jedis.multi();//开启事务
jedis.set("name", "Jack");
jedis.get("name");
jedis.incr("age");
jedis.exec();//提交事务
这里,我们使用了multi命令表示开始一批事务,然后我们依次执行set、get和incr命令,并使用exec命令表示提交事务。
2.2.3 事务提交与回滚
执行exec命令,将一批Redis命令提交到服务端。当Redis服务器执行完这个队列里的所有命令后,会将执行结果返回给客户端,并退出事务模式。但是需要注意,如果某个命令执行失败,所有已经入队的命令都会被清除。
Jedis jedis = new Jedis("localhost", 6379);
jedis.multi();//开启事务
jedis.set("name", "Jack");
jedis.get("name");
jedis.incr("age");
jedis.exec();//提交事务jedis.discard();//回滚事务
这里使用了discard命令来回滚当前事务
三、Redis 持久化机制
3.1 持久化机制基本概念
Redis是一种内存数据库,即数据保存在内存中。但是,一旦Redis服务器崩溃,所有内存中的数据都将丢失。为了避免这种情况,Redis提供了持久化机制,可以将数据保存到物理磁盘上。当Redis重新启动时,可以从磁盘加载数据。
持久化机制分为两种:RDB持久化和AOF持久化。
3.2 Redis 持久化方案
3.2.1 RDB 持久化
RDB持久化是指将Redis的数据集快照保存到硬盘上。快照可以基于时间、基于次数等方式进行触发,其中基于时间方式就是在规定的时间间隔内将数据快照保存到硬盘。同时,用户还可以手动执行save命令或者bgsave命令来生成快照。RDB持久化的优点是生成的快照文件相对紧凑,在恢复大量数据时比AOF方式要快。
//手动执行RDB持久化的代码示例
Jedis jedis = new Jedis("localhost");
jedis.bgsave();
3.2.2 AOF 持久化
AOF持久化是指将Redis的所有操作日志以追加的形式写到磁盘上。因为是追加写入,所以不会像RDB那样有一次性写入磁盘导致数据不一致的风险。同时,AOF持久化也支持在数据量达到一定阈值或者时间间隔到达一定时间后自动重写日志文件。
//手动开启AOF持久化的代码示例
Jedis jedis = new Jedis("localhost");
jedis.configSet("appendonly", "yes");
四、Redis复制原理
4.1 复制原理基本概念
Redis的复制功能是指将一台Redis服务器的数据复制到其他服务器上,以实现数据在多个节点间的共享和备份。它可以以主从模式进行复制,也可以以哨兵或集群模式运行。
Redis采用异步模式进行复制,即主节点会将自己的数据库操作记录到内存缓冲区,并将这些操作日志以RDB文件或AOF日志的形式保存到硬盘中。当从节点请求同步时,主节点向从节点发送保存在缓冲区中的操作记录,并在处理完请求后再向从节点发送已保存到硬盘中的操作日志进行同步。
4.2 Redis复制模式
4.2.1 主从复制
主从复制是Redis复制最常见的方式,它包括一个主节点和多个从节点。
当主节点发生写操作时,它将立即将该操作同步给所有从节点,并等待所有从节点的回复。只有当所有从节点都完成了操作,主节点才认为该操作完成。从节点在接收到主节点的同步操作后,会立即执行该操作,然后将执行结果反馈给主节点。
主节点负责整个集群的写操作,而从节点基本上只读取数据以提高性能并减轻主节点负载。在主从复制中,从节点即可以通过执行读操作来查询数据,也可以通过Lua脚本在从节点上执行一些特殊的操作。但是,从节点不能执行写操作,因为主节点会拒绝这些操作。
4.2.2 哨兵模式
哨兵模式是一种自动故障转移和容错机制,它可以让Redis集群保持高可用性。
哨兵模式包含多个哨兵节点和多个Redis节点。当任何一个Redis节点发生故障时,哨兵节点将根据预定义的规则自动选举出备用节点并将其设为新的主节点。一旦发生主从切换,客户端将会重新连接到新的主节点,并执行所有写操作。
4.2.3 集群模式
Redis集群模式能够实现数据的自动分配和负载均衡。集群模式包含多个Redis节点,它们共享一个集群配置文件,并使用一致性哈希算法将数据分布到不同的节点中。
当一个Redis节点失败时,集群会将该节点的数据自动转移到其他节点,并启动一个新节点来代替故障节点。集群还支持对节点进行扩展,以支持更大的负载和更多的数据存储。
相关文章:
Redis 事务、持久化、复制原理分析
Redis 事务、持久化、复制原理分析 一、Redis 简介1.1 Redis1.2 Redis 事务 二、Redis 事务机制2.1 事务基本概念2.2 Redis 事务操作2.2.1 开启事务2.2.2 批量执行命令2.2.3 事务提交与回滚 三、Redis 持久化机制3.1 持久化机制基本概念3.2 Redis 持久化方案3.2.1 RDB 持久化3.…...
初识鸿蒙跨平台开发框架ArkUI-X
HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景&#…...
uniapp开发小程序-分包(微信错误码:800051)
在使用uniapp开发小程序时,上传的时候因为文件过大,显示上传失败。 以下是开发过程中遇到的问题及解决方法: 1. 问题一:因为文件过大,显示上传失败 ①尝试过把本地使用的图片压缩到最小; ②把图片转换为网…...
n-皇后问题
希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 不清楚蓝桥杯考什么的点点下方👇 考点秘籍 想背纯享模版的伙伴们点点下方👇 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不能错过的模板大全…...
JS如何向数组中添加数组
常见的办法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…...
串口通信收发项目级一
void 定时器中断函数入口(void) { if(判断是否为定时器中断) { static uint16_t num定义静态变量; static uint8_t index定义静态变量; unsigned char buff_busy定义局部变量; if(串口中断接收数据数量>静态变量) { 静态变量串口中断接收数据数量; } else if(静态变量串口中…...
设计模式之七:适配器模式与外观模式
面向对象适配器将一个接口转换成另一个接口,以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…...
FFmpeg接收UDP码流
一、FFmpeg参数初始化: //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等//设置缓存大小,1080p可将值调大av_dict_set(&options, "buffer_size", "8192000", 0);//以tcp方式打开,如果以udp方式打开将tcp替换为udpav_dict_set(…...
【Pytroch】基于支持向量机算法的数据分类预测(Excel可直接替换数据)
【Pytroch】基于支持向量机算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 支持向量机(Support Vector Machine,SVM)是一种强大的监…...
【Git】git初始化项目时 | git默认创建main分之 | 如何将git默认分支从main改为master
git 更改 branch 在 Git 中,如果你在第一次提交后想要将默认分支名从 main 修改为 master,你可以按照以下步骤进行操作: 创建 master 分支: 首先,你需要在当前的 main 分支基础上创建一个新的 master 分支。使用以下命…...
Vue3中配置environment
environment顾名思义就是环境,对于项目来说,无非就是: 开发环境:development生产环境:production 某些逻辑,配置等在两个不同的环境中要呈现出不同的状态,所以environment是一个必要的事情。 …...
前端基础积累_新技术_Vue_React_H5_奇怪的BUG_面试_招聘
前端之路 序 前几天在博客园收到了一封来自出版社的消息,说看到原来很久之前写的 < VueJS 源码分析的文章 > 希望能够联系他们出版社去写书。这样的事情虽然在博客园是会经常发生的,但是这也让我意识到了,多多写高质量的文章能够给 co…...
【密码学】维京密码
维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义,但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量,将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…...
小米基于 Flink 的实时计算资源治理实践
摘要:本文整理自小米高级软件工程师张蛟,在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分: 发展现状与规模框架层治理实践平台层治理实践未来规划与展望 点击查看原文视频 & 演讲PPT 一、发展现状与规模 如上图…...
React源码解析18(3)------ beginWork的工作流程【mount】
摘要 OK,经过上一篇文章。我们调用了: const root document.querySelector(#root); ReactDOM.createRoot(root)生成了FilberRootNode和HostRootFilber。 并且二者之间的对应关系也已经确定。 而下一步我们就需要调用render方法来讲react元素挂载在ro…...
JAVA SpringBoot 项目 多线程、线程池的使用。
1.1 线程: 线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径 单线程:一个进程中包含一个顺序控制流(一条执行路径) 多线程:一个进程中包含多个顺序控制流(多条执行路径࿰…...
【数据结构与算法】动态规划算法
动态规划算法 应用场景 - 背包问题 背包问题:有一个背包,容量为 4 磅,现有如下物品: 物品重量价格吉他(G)11500音响(S)43000电脑(L)32000 要求达到的目标…...
离线安装vscode插件,导出 Visual Studio Code 的扩展应用,并离线安装
在没有网络的情况下,如何安装vscode插件 1.使用之前电脑安装过的插件包 Visual Studio Code 的扩展应用安装位置在文件夹 .vscode/extensions 下。不同平台,它位于: Windows %USERPROFILE%\.vscode\extensions Mac ~/.vscode/extensions L…...
【ChatGPT 指令大全】怎么使用ChatGPT辅助程式开发
目录 写程式 解读程式码 重构程式码 解 bug 写测试 写 Regex 总结 在当今快节奏的数字化世界中,程式开发变得越来越重要和普遍。无论是开发应用程序、网站还是其他软件,程式开发的需求都在不断增长。然而,有时候我们可能会遇到各种问题…...
涂色
蜀山区2021年信息学竞赛试题 题目描述 Description 小李喜欢写日记,为了有效区分每题记录的内容,他循环使用七种不同颜色的笔在日记本上记录每天发生的事情,循环次序分别为Red,Orange,Yellow,Green,Blue,Cyan,Purple,由于近期工作繁忙&…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
