【Redis7】--4.事务、管道、发布和订阅

news2024/12/27 13:06:39

文章目录

  • 事务
    • 1.Redis事务
    • 2.Redis事务特性
    • 3.Redis事务命令
      • 3.1MULTI
      • 3.2EXEC
      • 3.3DISCARD
      • 3.4WATCH
      • 3.5UNWATCH
    • 4.不保证原子性
      • 4.1"全体连坐"
      • 4.2"冤头债主"
    • 5.事务执行流程
  • 管道
    • 1.pipeline的使用
    • 2.pipeline小总结
  • 发布和订阅
    • 1.常用命令
      • 1.1SUBSCRIBE
      • 1.2PUBLISH
      • 1.3PSUBSCRIBE
      • 1.4PUBSUB
      • 1.5UNSUBSCRIBE
      • 1.6 PUNSUBSCRIBE
    • 2.总结

事务

1.Redis事务

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

在一个队列中,一次性、顺序性、排他性的执行一系列命令

Redis 事务使用 MULTI、EXEC、WATCH、DISCARD 和 UNWATCH 这些命令来实现。

2.Redis事务特性

Redis事务vs数据库事务

image-20230918202409407

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  • 不保证原子性:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
  • 排他性:Redis会保证一个事务内的命令依次执行,不会被其他命令插入

3.Redis事务命令

MULTI:开启事务

EXEC:执行事务

DISCARD:取消事务

WATCH key [key ...]:监控指定的key

UNWATCH :取消监控。

3.1MULTI

标记一个事务块的开始。执行的命令都会放到一个队列中,通过EXEC命令统一执行。

3.2EXEC

执行事务队列中的命令。

image-20230918204251779

3.3DISCARD

放弃事务。在开启了事务后,若不想执行命令了,可以通过DISCARD命令来取消事务。

image-20230918204340697

3.4WATCH

监控指定的key的变化,要先开启监控,再开启事务。若监控的数据被篡改了,则事务中无法再对其修改,会返回nil。

执行完EXEC命令后,之前加的监控都会失效。

Redis使用Watch来提供乐观锁定,类似于CAS

回顾一下悲观锁、乐观锁:

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

乐观锁策略:提交版本必须 大于 记录当前版本才能执行更新

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

image-20230918204712152

有加塞篡改:

image-20230918204846786

3.5UNWATCH

取消监控。在对某个key监控后,已经发现了它被篡改过了,可以使用unwatch命令取消对该key的监控。

image-20230918204927500

4.不保证原子性

4.1"全体连坐"

要么都执行,要么都不执行。

image-20230918205032972

4.2"冤头债主"

错误的命令报错归报错,正确的命令依旧执行,即使在错误命令之后也会执行。

image-20230918205131077

注意和传统数据库事务区别,不一定要么一起成功要么一起失败

5.事务执行流程

(1)开启:以MULTI命令开启一个事务

(2)入队:将多个命令假如到事务队列中,接到这些命令并不会立即执行。

(3)执行:由EXEC命令执行事务队列中的命令。

管道

image-20230918210238572

image-20230918210245630

image-20230918210307655

Redis 管道(Pipeline)是一种在客户端和 Redis 服务器之间建立的双向通道,它可以让客户端在一次请求中发送多个命令并一次性接收多个命令的响应结果。通过使用 Redis 管道,客户端可以减少网络通信的次数,从而提高 Redis 的吞吐量和性能。

在传统的 Redis 操作中,每个命令都需要通过网络发送到 Redis 服务器,然后等待 Redis 服务器返回响应结果后再进行下一个命令的操作,这样就会产生大量的网络通信开销。而使用 Redis 管道,客户端可以将多个命令一次性发送到 Redis 服务器,然后一次性接收所有命令的响应结果,从而减少网络通信的次数和开销。

批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)

1.pipeline的使用

首先创建一个文件,写入需要执行的命令集。
在Linux终端使用cat cmd.txt | redis-cli -a 123456 --pipe命令将命令集传输到服务器。
(管道符”|“表示将前面命令的结果集作为参数传输给后面的命令)

image-20230918210355174

2.pipeline小总结

  • Pipeline与原生批量命令对比:

    • 原生批量命令(例如mset、mget)具有原子性,pipeline是非原子性。
    • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令。
    • 原生批命令是redis服务端实现,而pipeline需要redis服务端和客户端共同完成。
  • Pipeline与事务对比:

    • 事务具有原子性,管道不具有原子性。
    • 管道一次性将命令发送给服务器,事务是一条一条的发,事务只有在接收到EXEC命令后才会执行。
    • 执行事务时会阻塞其他命令的执行,而执行管道中的命令不会。
  • 使用Pipeline注意事项:

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

发布和订阅

Redis发布和订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,用于在Redis中实现消息的发布和订阅,发送者发送消息,订阅者接收消息,可以实现进程之间的消息传递

在 Redis 中,发布者(Publisher)可以将消息发送到一个或多个频道(Channel),订阅者(Subscriber)可以订阅一个或多个频道,以接收发布者发送的消息。当发布者在某个频道上发布一条消息时,所有订阅该频道的订阅者都会收到这条消息。

Redis Pub/Sub 是基于消息传递的异步通信模型,可以用于构建实时系统、聊天室、实时广播等应用场景。

image-20230918210940173

1.常用命令

1.1SUBSCRIBE

SUBSCRIBE channel [channel ...]:订阅一个或多个频道

一旦客户进入了订阅状态,客户端就只能接受订阅相关的命令SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE,除了这些命令,其他命令一律失效。按Ctrl+C结束订阅状态。

返回值:发布类型、频道名称、第几个频道

image-20230918212312940

1.2PUBLISH

PUBLISH channel message:发布消息到指定频道。

返回值为收到消息的客户端数量。

1.3PSUBSCRIBE

PSUBSCRIBE pattern [pattern ...]:按照匹配模式批量订阅。

支持的模式有:?表示任意一个字符;*表示任意数量的任意字符;[]表示中括号中的指定字符。比如:
h?llo:可以匹配hallo、hbllo、hello…
h*llo:可以匹配hello、heeello、habcdello…
h[abc]llo:只能匹配hallo、hbllo、hcllo

1.4PUBSUB

PUBSUB 是自省命令,能够检测PUB/SUB子系统的状态。

PUBSUB CHANNELS [pattern] :返回当前活跃的频道。

只会统计使用SUBSCRIBE订阅的频道。

PUBSUB NUMSUB channel [channel ...]:返回指定频道订阅者的个数。

只会统计使用SUBSCRIBE订阅的订阅者个数。

PUBSUB UNMPAT:返回订阅模式(PSUBSCRIBE)的数量。

这个命令返回的不是订阅模式的订阅者数量, 而是所有Redis客户端(订阅者)订阅的所有模式的数量总和。

image-20230918212434855

image-20230918212440587

1.5UNSUBSCRIBE

UNSUBSCRIBE channel [channel ...]:指示客户端退订指定频道,若没有指定频道则退订所有频道。

image-20230918212649890

1.6 PUNSUBSCRIBE

PUNSUBSCRIBE pattern [pattern ...]:指示客户端退订指定模式,若没有提供模式则退定所有模式。

2.总结

Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流,但是专业的事情交给专业的中间件处理,redis主要做好分布式缓存功能

  • 发布的消息在Redis系统不能持久化,因此必须先执行订阅,再等待消息发布,如果先发布了消息且该消息没有订阅者接收,那么该消息被直接丢弃。
  • 消息只管发送,对于发布者而言消息是即发即失的,也没有ACK机制,无法保证消息是否消费成功。
  • Redis5.0新增了Stream数据结构,不但支持多播,还支持数据持久化,比Pub/Sub更加强大。

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

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

相关文章

小鹏、长城先后宣布智能计划,传统车企与新势力决战AI赛点?

点击关注 文|姚 悦,编|王一粟 “尽管我们已经造车30多年,但现在我们面临一个全新问题和挑战。”长城汽车AI Lab负责人杨继峰表示,“在AI时代里每个问题都是AI问题。” 杨继峰所负责的AI Lab,正是长城汽车…

线性代数的本质——几何角度理解

B站网课来自 3Blue1Brown的翻译版,看完醍醐灌顶,强烈推荐: 线性代数的本质 本课程从几何的角度翻译了线代中各种核心的概念及性质,对做题和练习效果有实质性的提高,下面博主来总结一下自己的理解 1.向量的本质 在物…

uniapp项目实践总结(十七)实现滚动触底加载

导语:在日测的开发过程中,经常会碰到页面需要渲染大量数据的情况,这时候就需要用到滚动加载功能,下面总结一下方法。 目录 原理分析实战演练案例展示 原理分析 使用scrolltolower事件来监听滚动到底部,然后加载下一…

RabbitMQ深入 —— 死信队列

前言 前面荔枝梳理了RabbitMQ中的普通队列、交换机以及相关的知识,在这篇文章中荔枝将会梳理RabbitMQ的一个重要的队列 —— 死信队列,主要了解消息流转到死信队列的三种的方式以及相应的实现demo。希望能帮助到有需要的小伙伴~~~ 文章目录 前言 死信队…

C++——构造函数

定义 构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调节,保证每个数据成员都有一个合适的初始值,并且在对象的声明周期内只调用一次。 特性 1.函数名和类名相同 2.无返回值 3.对象实例化时编译…

自动化测试工具slelnium的初体验

1.slelnium介绍 1.1 一个Web的自动化测试工具,最初是为网站自动化测试而开发的。 1.2 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页…

锐捷交换机vlan隔离(wifi段仅能访问外网,和内网隔离)

因为公司的wifi段,未做隔离,无意间上了网,发现能访问内网网段,这里内网是10、20段,管理网段是100段,于是做了和内网的vlan隔离。 拓朴如下,所有vlan的网关都起在核心上,核心上起了DH…

23062QTday2

完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮…

华为数通方向HCIP-DataCom H12-831题库(单选题:41-60)

第41题 除了虚连接之外,OSPFV3的Hello报文源IPv6地址是哪种类型的IPv6地址? A、IPv6任播地址 B、唯一本地地址 C、全球单播地址 D、链路本地地址 答案: D 解析: 这里题目是源IPv6,不是目的IPv6,与另一题类似 第42题 下列描述中关于MPLS网络中配置静态LSP正确的是? A、…

three.js——模型对象的使用材质和方法

模型对象的使用材质和方法 前言效果图1、旋转、缩放、平移,居中的使用1.1 旋转rotation(.rotateX()、.rotateY()、.rotateZ())1.2缩放.scale()1.3平移.translate()1.4居中.center() 2、材质属性.wireframe 前言 BufferGeometry通过.scale()、…

uniapp h5网页打开白屏

修改了默认基本运行路径,然后直接打开index.html的情况下是会这样,放在nginx服务器上运行就ok了。 把默认的./ 路径修改了:/cloudh5 nginx html目录下放子网站 :/cloudh5:

【深度学习实验】线性模型(二):使用NumPy实现线性模型:梯度下降法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 初始化参数 2. 线性模型 linear_model 3. 损失函数loss_function 4. 梯度计算函数compute_gradients 5. 梯度下降函数gradient_descent 6. 调用函数 一、实验介绍 使用Nu…

Lombok依赖

一.介绍 Project Lombok 是一个 Java 库,它会自动插入编辑器和构建工具,为您的 Java 增添趣味。永远不要再写另一个 getter 或 equals 方法,使用一个注释,您的类有一个功能齐全的构建器,自动化您的日志记录变量等等。…

2023陇剑杯

2023陇剑杯初赛WP HW hard_web_1 ​ 首先判断哪个是服务器地址 ​ 从响应包看,给客户端返回数据包的就是服务器 所以确定服务器地址是192.168.162.188​ 再从开放端口来看,长期开放的端口 客户端发送一个TCP SYN包(同步请求&#xff…

VisualBox QA

出现提示注册表错误,或者之前正常,重启VisualBox后,VM运行失败时,可通过正确卸载VisualBox,然后使用注册表清理软件(CCleaner)清理注册表后,重装VisualBox,即会正常。(一般用这个能解…

CSS Id和Class选择器

文章目录 CSS id 选择器示例 CSS class 选择器CSS id和class的区别和相同点 CSS id 选择器 CSS的id选择器是以“#”开头的,用于选择具有特定id属性的HTML元素。 在HTML文档中,每个id应该是全局唯一的,也就是说,每个id只能用于一…

复杂场景:揭秘新生代光伏独角兽企业的数据管理秘诀

项目背景 最新一个光伏独角兽诞生了。 投资界获悉,一道新能源科技股份有限公司(以下简称“一道新能”)完成Pre-IPO融资。经多家投资方核实,此轮投后估值近80亿元。 一道新能源科技股份有限公司,成立于2018年8月&…

就业创业证查询

这里写目录标题 问题描述结果 问题描述 全国就业创业证查询系统自改版本后不支持根据姓名身份证号查询了,从社保局查又需要证书编号。 结果 经过不谢努力找到了解决办法,可以根据身份证姓名批量查询人员是否有就业证。

【Flowable】使用UEL整合Springboot从0到1(四)

前言 在前面我们介绍了Springboot简单使用了foleable以及flowableUI的安装和使用,在之前我们分配任务的处理人的时候都是通过Assignee去指定固定的人的。这在实际业务中是不合适的,我们希望在流程中动态的去解析每个节点的处理人,当前flowab…

家里电脑怎样远程办公室电脑?快解析映射域名实现内网穿透

远程电脑怎么操作是大家比较关注的问题,特别是涉及内外网,不在同一个局域网内不同计算机间的远程连接访问,如家里电脑怎样远程办公室电脑?这里提供一种简便的异地远程方法:用快解析。通过快解析映射域名软件&#xff0…