【Redis7】Redis7 事务管道发布订阅

news2024/11/16 12:52:26

 【大家好,我是爱干饭的猿,本文重点介绍Redis7 事务、管道和发布订阅。

后续会继续分享Redis7和其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【Redis7】Redis7 持久化(重点:RDB与AOF重写机制)》


目录

🍣1. 事务

1.1 概述

1.2 Redis事务和数据库事务

1.3 redis 事务命令

case1: 正常执行

case2: 放弃事务

case3: 全体连坐

case4: 冤头债主

case5: watch监控

1.4 总结

🍣2. 管道

2.1 面试题

2.2 概述

2.3 总结

🍣3. 发布订阅

3.1 概述

3.2 常用命令

3.3 总结


🍣1. 事务

1.1 概述

  • 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化, 按顺序地串行化执行而不会被其他命令插入,不许加塞
  • 一个队列中,一次性、顺序性、排他性的执行一系列命令

1.2 Redis事务和数据库事务

1.3 redis 事务命令

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

case1: 正常执行

MULTI     // 事务开始
set ...
EXEC      // 执行

case2: 放弃事务

MULTI     // 事务开始
set ...
DISCARD   // 放弃事务

case3: 全体连坐

若执行语句语法编译不成功,则全部执行失败

MULTI     // 事务开始
set k1    // 语法编译不成功
EXEC      // 执行

case4: 冤头债主

  • Redis 不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态
  • 注意和传统数据库事务区别,不一定要么一起成功要么一起失败
set k1 aabb

MULTI     // 事务开始
incr k1   // 语法编译成功,但运行失败
EXEC      // 执行

前期语法都没错,编译通过,执行exec后报错: 对的执行,错的停

case5: watch监控

Watch 监控

  • Redis使用Watch 来提供乐观锁定,类似于 CAS(Check-and-Set)
    • 悲观锁
      • 认为每次去拿数据都很认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁
    • 乐观锁
      • 认为每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据
      • 提交版本必须 大于 记录当前版本才能执行更新
    • CAS
      • check-and-set(JUC中CAS操作相似)

watch

  • 初始化 键值(k1 和 balance 两个key),先监控再开启multi,保证两key变动在同一事务内

set k1 111
watch k1
multi 
set k1 222
exec

有加塞篡改的话

  • watch 命令是一种乐观锁的实现,Redis 在修改的时候会检测数据是否被更改,如果更改了,则执行失败
// 事务1
set k1 111
watch k1  
multi 
set k1 222
exec

// 事务2 在事务1监控k1之后,修改数据,事务1执行失败
set k1 333 

unwatch

  • 放弃对键值监控
set k1 111
watch k1 
nuwatch k1
multi
set k1 222
exec // 执行成功

小结:

  • 一旦执行了 exec 之前加的watch监控锁都会被取消掉
  • 当客户端连接丢失的时候(比如退出连接),所有东西都会被取消监视

1.4 总结

  • 开启
    • 以 MULTI 开始一个事务
  • 入队
    • 将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  • 执行
    • 由EXEC命令触发事务

🍣2. 管道

2.1 面试题

如何优化频繁命令往返造成的性能瓶颈?

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤:

  1. 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。
  2. 服务端处理命令,并将结果返回给客户端。
上述两步称为:Round Trip Time(简称RTT,数据包往返于两端的时间) 

如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了,性能不太好,o(╥﹏╥)o

利用管道来解决

2.2 概述

管道(pipeline)可以一次性发送多条命令给服务端。

  • 服务端依次处理完完毕后,通过一条响应一次性将结果返回,通过减少客户端与redis的通信次数来实现降低往返延时时间。
  • pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。

 

也就是批处理

  • 将多个命令都存在一个txt文件中,然后一同批处理,验证批处理
  • 命令:cat ***.txt | redis-cli -a 密码 --pipe

2.3 总结

  • Pipeline 与原生批量
    • 原生批量命令是原子性(如:mset,mget),pipeline是非原子性
    • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
    • 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成
  • Pipeline 与事务对比
    • 事务具有原子性,管道不具有原子性
    • 管道一次性将多条命令发送到服务器,事务是一条一条发的,事务只有在接收到exec命令后才会执行,管道不会
    • 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会
  • Pipeline 注意事项
    • pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令
    • 使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务器也被迫回复一个队列答复,占用很多内存

🍣3. 发布订阅

3.1 概述

  • 是一种消息通信模式:
    • 发送者(PUBLISH)发送消息
    • 订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递
  • Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流
  • 功能
    • Redis客户端可以订阅任意数量的频道,类似我们微信关注多个公众号

 

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

3.2 常用命令

SUBSCRIBE channel [channel]   // 订阅多个频道
PUBLISH channel message       // 对一个频道发布信息
PSUBSCRIBE pattern [pattern...]  // 按照模式批量订阅,订阅一个或多个符合给定模式(支持*号?号之类的)的频道
PUSUB CHANNELS                // 由活跃频道组成的列表
PUSUB NUMSUB channel [channel...]   // 某个频道有几个订阅者
PUBSUB NUMPAT   // 只统计使用PUBSCRIBE 命令执行的,返回客户端订阅的唯一模式的数量
UNSUBSCRIBE channel [channel...]    // 取消订阅
PUNSUBSCRIBE pattern [pattern...]   // 退订所有给定模式的频道

3.3 总结

  • 优点
    • Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。(但不建议用,专业的事交给专业的工具MQ、kafka、RabbitMQ)
  • 缺点
    • 发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃
    • 消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功。
    • 以上的缺点导致Redis的Pub/Sub模式就像个小玩具,在生产环境中几乎无用武之地,为此,Redis5.0版本新增了stream数据结构,不但支持多播,还支持数据持久化,相比Pub/Sub更加的强大

分享到此,感谢大家观看!!!

如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

🏓🏓🏓

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

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

相关文章

Qt扫盲-QXYSeries理论总结

QXYSeries理论总结 一、概述二、常用函数介绍1. 维护点2. 绘图相关3. 绘制标签 三、信号说明1. Point 增删相关2. Point 鼠标相关3. 图变化相关 一、概述 QXYSeries 类是折线图、曲线图、散点图的基类。这个类其实就是维护的是图线的相关信息,就比如是这个线条的颜…

5、cmake的简单认识及CMakeLists.txt的编写语法

文章目录 1、cmake是什么(1)cmake的两大功能 2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)(1)cmake常见预定义1)常见的预定义变量2)系统信息预定义变量3)开…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号:AI-era Meta的LLaMA模型开源,让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到,一次意外的LLaMA泄漏,竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

Linux系统网络传输之端口详解

Linux系统网络传输之端口详解 1、端口的概念2、安装namp3、查看端口占用情况4、安装net-tools5、查看指定端口占用情况 1、端口的概念 计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xf…

《花雕学AI》深度测试ChatGPT国内镜像站:超简单提示词的猫娘角色扮演,真的好神奇啊!

偶然看过一篇讲解如何使用ChatGPT调教猫娘的文章,有六个步骤,许许多多的调教提示语,让我感觉这是一件非常复杂与专业的事情。今天有空,于是就想先从简单的开始尝试一下。我使用了最简单的提示词:”ChatGPT角色扮演猫娘…

分布式事务Seata实践入门

1 前言 现在应用基本上都是分布式部署,那么针对分布式事务问题,也有对应的解决方案。经过简单的调研,最后选择了阿里的 Seata 组件,来实现分布式事务。 Seata是2019年1月份,蚂蚁金服和阿里巴巴共同开源的分布式事务解…

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念 服务器操作系统安装步骤 记录一下服务器操作系统安装过程,虽然简单但还是有一些坑需要注意,本次使用的是联想服务器ThinkSyst…

VS2019中Ctrl+左键不起作用和控制台不驻留(cmd窗口闪退)

1、关于Ctrl左键不起作用 解决:在线装个插件就行。 工具>>扩展和更新 联机>>VS库>>所搜插件“GO TO Definition” 安装,重启VS即可。 2、关于控制台不驻留 当然这个问题解决方案有很多,这个是首选吧

[Java·算法·中等]LeetCode105. 从前序与中序遍历序列构造二叉树

每天一题,防止痴呆 前言题目示例分析思路1题解1分析思路2题解2 👉️ 力扣原文 前言 二叉树前序遍历的顺序为: 先遍历根节点; 随后递归地遍历左子树; 最后递归地遍历右子树。 二叉树中序遍历的顺序为: 先递…

HCIP-6.9BGP路由反射器原理与配置

路由反射器原理与配置 1、路由反射器概念1.1、路由反射器原理:1.2、多集群路由反射器1.3、备份路由反射器2、路由反射器配置3、路由反射器防环机制 1、路由反射器概念 IBGP的水平分割,IBGP 1只能update一跳,就是说在IBGP 2 设备收到IBGP 1设…

【RocketMQ】事务的实现原理

事务的使用 RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚。以创建订单…

12-RabbitMQ

一 RabbitMQ概念 1 MQ 消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复 异步通信相当于通过第三方转述对…

ObjectBox一种基于中心点的无锚点目标检测方法

ObjectBox: From Centers to Boxes for Anchor-Free Object Detection 论文地址:https://arxiv.org/pdf/2207.06985.pdf 官方代码:https://github.com/MohsenZand/ObjectBox 基于中心点的无锚点目标检测方法是一种目标检测方法,其思路是将目…

DJ编曲用什么软件,DJ编曲教需要哪些步骤

随着现在人们的生活水平不断提高,我们的精神生活也越来越丰富,对于现在的年轻人来说,DJ舞曲是一个较受欢迎的领域,有许多年轻人对DJ这个职业感兴趣,想要深入了解DJ编曲这份工作,那么今天我们就来说一说DJ编…

300元买什么蓝牙耳机性价比高?300左右性价比高的蓝牙耳机推荐

TWS耳机已经成了很多人生活的必需品,如今的耳机在设计、功能、体验等方面都非常完善,拥有一副TWS耳机似乎已经成为时尚的标志,尤其是年轻群体,耳机既是听歌、娱乐的主力设备,也是穿搭风格、个性的体现,下面…

JDBC事务 Hibernate事务 EJB事务详解

🏆今日学习目标: 🍀JDBC事务 Hibernate事务 EJB事务详解 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你…

【学习笔记】Integral Human Pose Regression

【学习资料】一文总结Integral Pose Regression方法的方方面面 - 知乎(总结的很到位,一定要去看) 1.两种基本方法的对比 1.解码方式 softmax和argmax的区别: 由于深度神经网络中的下采样步骤,热图的分辨率低于输入…

如何在电脑本地下载镜像重装系统

现在网上随处可以下载操作系统,下载下来的是镜像系统,很多朋友都不知道电脑镜像重装系统是什么意思,怎么用镜像重装系统,今天小编就给大家带来了电脑镜像重装系统是什么意思的相关解答,一起往下看。 电脑镜像重装系统是…

从FPGA说起的深度学习(七)-循环并行化

这是新的系列教程,在本教程中,我们将介绍使用 FPGA 实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。在本教程中,旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

不良事件上报系统源码开发,不良事件上报系统源码

不良事件管理系统源码,有演示,支持二开,可正常上线运营。 相关技术:PHPvscodevue2elementlaravel8mysql5.7 文末获取联系! 医院安全不良事件上报系统,对患者安全(不良)事件实施全过…