Redis(三)事务、管道、主从复制

事务

事务是可以执行一个命令,也可以执行多个命令,事务本质上是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化地执行而不会被其他命令插入

Redis事务和传统数据库的区别

  1. 单独的隔离操作:Redis的事务仅仅是保证事务里面的操作会被连续独占的执行,redis命令的执行是单线程架构,在执行完事务内的所有指令之前是不可能再去同时执行其他客户端的请求的
  2. 没有隔离级别的概念:因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里面的更新,在事务外查询不能看到”这种问题了
  3. 不保证原子性:Redis的事务不保证原子性,也就是不保证所有的指令同时成功或失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
  4. 排他性:Redis会保证一个事务内的命令依次执行,而不会被其他命令插入

事务相关命令

  1. DISCARD:取消事务,放弃执行事务块内的所有命令
  2. EXEC:执行事务块中的所有命令
  3. MULTI:标记一个事务的开始
  4. UNWATCH:取消WATCH对所有key的监视
  5. WATCH key [key ……] :监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断

事务情况

正常执行

MULTI、EXEC

先执行MULTI的命令,就会开始记录命令,接下来的命令都会放入一个队列中,最后使用EXEC命令,放入队列中的命令会依次执行

放弃执行

MULTI、DISCARD

执行了MULTI命令之后,开始创建事务,若是想要放弃执行此事务,就使用DISCARD命令,就会退出事务

全体连坐

只要有一个命令是错的(写命令的时候就是错的),整个事务都会放弃执行,只有整个事务中的命令都是没问题的,才能正常执行此事务

怨头债主

当写事务中的命令时,写命令的语法都没错,执行EXEC之后,编译有的命令没通过,此时编译的命令执行成功,编译错的命令执行失败,Redis不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态。

watch监控

watch命令是一种乐观锁的实现,redis在修改时会检测数据是否被更改,如果更改了,则执行失败。

使用unwatch就可以放弃监控

一旦执行了EXEC,之前加的监控锁都会被取消掉了

当客户端连接丢失的时候(比如退出连接),所有的东西都取消监视

管道

管道(pipeline)可以一次性地发送多条命令给服务端,服务端依次处理完毕后,通过一条响应一次性将结果返回,通过减少客户端与redis的通信次数来实现降低往返延时时间。pipeline实现的原理是队列,先进先出的特性保证数据的顺序性。

以下方式可以实现管道:

cat 写有命令的文件 | redis-cli -a 123456 --pine

Pipeline与原生批量命令对比

  1. 原生批量命令是原子性,pipeline是非原子性
  2. 原生批量命令依次只能执行一种命令,pipeline支持批量执行不同命令
  3. 原生批量命令是服务端实现,而pipeline需要服务与客户端共同完成

Pipeline与事务的对比

  1. 事务具有原子性,管道不具有原子性
  2. 管道一次性将多条命令发送到服务器,事务是一条一条地发,事务只有在接收到exec的命令后才会执行,管道不会
  3. 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会

使用Pipe命令注意事项

  1. pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中发生异常,将会继续执行后续的指令
  2. 使用pipeline组装的命令不能太多,不然数据量过大,客户端阻塞的时间可能过久,同时服务端此时也被迫回复一个队列应答,占用很多内存

发布订阅

是一种消息通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递。Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。不推荐使用该功能,专业的事情交给专业的中间件来处理,redis只要做好分布式缓冲功能。所以此知识点做了解即可。

发布订阅其实是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息

发布订阅的常用命令:

  1. 订阅一个或多个符合给定模式的频道:PSUBSCRIBE pattern [pattern……]
  2. 查看订阅与发布系统状态:PUBSUB subcommand [arg [arg……]]
  3. 将消息发送到指定的频道:PUBLISH channel message
  4. 退订所有给定模式的频道:PUNSUBSCRIBE [pattern [pattern]]
  5. 订阅给定的一个或者多个频道的信息:SUBSCRIBE channel [channel……]
  6. 退订所有给定的频道:UNSUBSCRIBE [channel [channel……]]

订阅的客户端可以收到一个三个参数的消息:

  1. 消息的种类
  2. 始发频道的名称
  3. 实际的消息内容

缺点

  1. 发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,在等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃
  2. 消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功。
  3. 以上的缺点导致Pub/Sub在生产环境中几乎无用武之地,为此Redis5.0新增了Stream数据类型,不仅支持多播,还支持数据持久化,相比Pub/Sub更为强大

主从复制

主机master上的redis以写为主,从机slave以读为主。当master数据变化的时候,自动将新的数据同步到其他的slave数据库

主从复制能解决 读写分离、容灾恢复、数据备份、水平扩容支持高并发 的问题

通常配置从库,不配置主库

权限细节:

master如果配置了requirepass参数,需要密码登录。那么slave就要配置masterauth来设置校验密码,否则的话master会拒绝slave的访问请求(在配置文件中配置)

基本操作命令

  • info replication:可以查看复制节点的主从关系和配置信息
  • replicaof 主库ip 主库端口:在从机上配置,指定是复制哪个主机(一般写入redis.conf内)
  • slaveof 主库ip 主库端口:每次与master断开之后,都需要重新连接,除非配置进reids.conf文件。在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库,那么将会定制和原主数据库的同步关系转而和新的主数据库同步,重新拜码头。
  • slaveof no one:使得当前数据库停止与其他数据库的同步

普通主从复制

配置文件配置时

从机切入点问题:

如果从机没启动,启动时会复制主机的数据,启动后,会跟上主机的写操作。

主机SHUTDOWN之后,从机的情况:

从机会停止不动,原地等待待命,从机的数据可以正常使用。等待主机开启后再正常运行。

主机重启后,主从关系还在,从机还能继续顺利复制

手动指定主从关系时

当从机指定了主机之后,要是SHUTDOWN之后,就会失去主从关系,使用手动命令指定的就仅限于此次运行时,所以建议确认了主机就使用配置文件配置

多代主从复制

比如有着三台服务器1、2、3,1是2的主机,2是3的主机,以这种多代的方式进行主从复制。比起2、3是1的从机,多代的方式减轻了主机1的写压力。

中途变更主机的时候,会清除之前的数据,重新拷贝新的主机的数据

主从复制工作流程

  1. slave启动成功后连接到master之后会发送一个sync命令。slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有的数据会被覆盖清除。
  2. master节点在收到sync命令后会开启在后台保存快照(即RDB持久化,主从复制的时候会触发RDB),同时收集所有接收到的用于修改数据集命令缓缓存起来,master节点执行RDB持久化完成后,master将rdb快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化。
  3. master会定期发送ping包,默认是十秒,保持主从的通信。
  4. master继续将新的所有收集到的修改命令自动依次传给slave,完成同步
  5. 从机下线后重连时,master会检查backlog里面的offset,master和slave都会保存一个复制的offset和一个masterId。offset是保存在backlog中的。master只会把已经复制的offset后面的数据复制给slave

主从复制的缺点

复制延时,信号衰减

由于所有的写操作都是现在master上操作,然后同步更新到slave上,所以master同步到slave机器有一定的延时,当系统很繁忙的时候,延迟问题会更加严重,slave机器的数量的增加也会倒是这个问题更加严重

主机挂了,要手动指定新主机

默认情况下,不会在slave节点中自动重选一个master,每次都要人工干预,重选一个主机

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

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

相关文章

Robot Operating System——深度解析监控Parameters修改的底层实现

大纲 AsyncParametersClientParameterEventHandler监控全部Parameters监控Node上Parameters的变动触发 总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》和《Robot Operating System——ParameterEventHandler监控Parameters的增删改行为…

《Java初阶数据结构》----10.<Map和Set---TreeSet和TreeMapHashSet和HashMap >

前言: 大家好,我目前在学习java。我准备利用这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!! 喜欢我文…

Linux守护进程daemon与服务service及systemctl命令的作用

在 Linux 系统的服务管理中会经常提到 daemon(守护进程) 与 service(服务),守护进程 daemon 是指后台运行的进程,随系统启动而为应用程序提供支持, 而服务 service 则用于提供某种功能。 简单的…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码,一起来看看吧! 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

C#实现数据采集系统-Mqtt实现采集数据转发

在数据采集系统中,通过ModbusTcp采集到数据之后,再通过MQTT转发到其他应用 MQTT操作 安装MQTT mqtt介绍和环境安装 使用MQTT 在C#/Net中使用Mqtt MQTT类封装 MQTT配置类 public class MqttConfig{public string Ip {get; set;

每日任务:网络协议对比:HTTPS/HTTP与TCP/UDP

1.HTTPS和HTTP有哪些区别 HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。HTTP 连接建立相对简单&#x…

【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构 📚本系列文章为个人学…

网站如何从0-1搭建部署蓝图介绍

第一步:网站规划 确定网站目的:明确网站的目标和预期的受众。内容规划:决定网站将包含哪些内容和功能。技术需求分析:确定所需的技术栈,例如前端和后端技术。 第二步:设计 草图和布局:绘制网…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库,但这里只介绍在实现知识库的过程中用到的知识。 1、分词器 先分词,中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的重要任务,它可以将文本数据转化为计算机能够理解和处理的向量形式。以…

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

接口测试工具:yapi和postman、Apifox 对比选型

在接口测试工具领域,YApi、Postman和Apifox都是备受推崇的工具,它们各有特点,适用于不同的测试场景和需求。以下是对这三款工具的详细对比选型分析: 一、YApi 1. 概述 YApi是一个可本地部署的、打通前后端及QA的、可视化的接口…

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

GO-学习-04-基本数据类型-浮点型

浮点型:float32和float64 %f -3.4e38——3.4e38 package main //import "fmt" //import "math" import ("fmt""unsafe""math" )func main(){//1.定义float类型var a float32 3.12fmt.Printf("值&#xff…

LeetCode 热题 HOT 100 (011/100)【宇宙最简单版】

【图论】No. 0200 岛屿数量 【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段,但是interface和module有关联,而且module和projects关联&#x…

linux下使用yum安装mysql

本文使用常规方式手动安装mysql 第一步 下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm第二步 安装mysql-community-release-el7-5.noarch.rpm包 rpm -ivh mysql-community-release-el7-5.noarch.rpm第三步 安装mysql-server yum -y…

Esp_server 安卓嵌入壳子,原创! 2024/7/28 20:58

用到的软件: uni-app 思路: 让用户感觉是,一个完整的程序.实际上只是一个类浏览器壳子.轻便小巧. 由于是第一次用uni-app开发类软件,所以前前后后耗费7小时! 隔行如隔山,不是白讲的. 软件界面: 软件功能: 简化输入: 输入ip地址,例:http:// www.baidu.com 完整网址 前面…

Javaer 5分钟入门 Golang

文章目录 前言一个 go 文件长啥样?Go 语言的变量变量类型变量声明 Go 语言的函数&方法Go 语言没有的概念访问修饰符面向对象模型异常处理机制 Go 语言高效简洁的并发编程总结 前言 这两年主流的编程语言 Golang,想必大家或多或少都接触过。云原生领…