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,由于近期工作繁忙&…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
