【Redis7】--4.事务、管道、发布和订阅
文章目录
- 事务
- 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数据库事务
- 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
- 不保证原子性:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
- 排他性:Redis会保证一个事务内的命令依次执行,不会被其他命令插入
3.Redis事务命令
MULTI
:开启事务
EXEC
:执行事务
DISCARD
:取消事务
WATCH key [key ...]
:监控指定的key
UNWATCH
:取消监控。
3.1MULTI
标记一个事务块的开始。执行的命令都会放到一个队列中,通过EXEC命令统一执行。
3.2EXEC
执行事务队列中的命令。
3.3DISCARD
放弃事务。在开启了事务后,若不想执行命令了,可以通过DISCARD命令来取消事务。
3.4WATCH
监控指定的key的变化,要先开启监控,再开启事务。若监控的数据被篡改了,则事务中无法再对其修改,会返回nil。
执行完EXEC命令后,之前加的监控都会失效。
Redis使用Watch来提供乐观锁定,类似于CAS
回顾一下悲观锁、乐观锁:
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁策略:提交版本必须 大于 记录当前版本才能执行更新
初始化k1和balance两个key,先监控再开启multi,保证两个key变动在同一个事务内
有加塞篡改:
3.5UNWATCH
取消监控。在对某个key监控后,已经发现了它被篡改过了,可以使用unwatch命令取消对该key的监控。
4.不保证原子性
4.1"全体连坐"
要么都执行,要么都不执行。
4.2"冤头债主"
错误的命令报错归报错,正确的命令依旧执行,即使在错误命令之后也会执行。
注意和传统数据库事务区别,不一定要么一起成功要么一起失败
5.事务执行流程
(1)开启:以MULTI命令开启一个事务
(2)入队:将多个命令假如到事务队列中,接到这些命令并不会立即执行。
(3)执行:由EXEC命令执行事务队列中的命令。
管道
Redis 管道(Pipeline)是一种在客户端和 Redis 服务器之间建立的双向通道,它可以让客户端在一次请求中发送多个命令并一次性接收多个命令的响应结果。通过使用 Redis 管道,客户端可以减少网络通信的次数,从而提高 Redis 的吞吐量和性能。
在传统的 Redis 操作中,每个命令都需要通过网络发送到 Redis 服务器,然后等待 Redis 服务器返回响应结果后再进行下一个命令的操作,这样就会产生大量的网络通信开销。而使用 Redis 管道,客户端可以将多个命令一次性发送到 Redis 服务器,然后一次性接收所有命令的响应结果,从而减少网络通信的次数和开销。
批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)
1.pipeline的使用
首先创建一个文件,写入需要执行的命令集。
在Linux终端使用cat cmd.txt | redis-cli -a 123456 --pipe
命令将命令集传输到服务器。
(管道符”|“表示将前面命令的结果集作为参数传输给后面的命令)
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 是基于消息传递的异步通信模型,可以用于构建实时系统、聊天室、实时广播等应用场景。
1.常用命令
1.1SUBSCRIBE
SUBSCRIBE channel [channel ...]
:订阅一个或多个频道
一旦客户进入了订阅状态,客户端就只能接受订阅相关的命令SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE,除了这些命令,其他命令一律失效。按Ctrl+C结束订阅状态。
返回值:发布类型、频道名称、第几个频道
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客户端(订阅者)订阅的所有模式的数量总和。
1.5UNSUBSCRIBE
UNSUBSCRIBE channel [channel ...]
:指示客户端退订指定频道,若没有指定频道则退订所有频道。
1.6 PUNSUBSCRIBE
PUNSUBSCRIBE pattern [pattern ...]
:指示客户端退订指定模式,若没有提供模式则退定所有模式。
2.总结
Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流,但是专业的事情交给专业的中间件处理,redis主要做好分布式缓存功能
- 发布的消息在Redis系统不能持久化,因此必须先执行订阅,再等待消息发布,如果先发布了消息且该消息没有订阅者接收,那么该消息被直接丢弃。
- 消息只管发送,对于发布者而言消息是即发即失的,也没有ACK机制,无法保证消息是否消费成功。
- Redis5.0新增了Stream数据结构,不但支持多播,还支持数据持久化,比Pub/Sub更加强大。
相关文章:
【Redis7】--4.事务、管道、发布和订阅
文章目录 事务1.Redis事务2.Redis事务特性3.Redis事务命令3.1MULTI3.2EXEC3.3DISCARD3.4WATCH3.5UNWATCH 4.不保证原子性4.1"全体连坐"4.2"冤头债主" 5.事务执行流程 管道1.pipeline的使用2.pipeline小总结 发布和订阅1.常用命令1.1SUBSCRIBE1.2PUBLISH1.3…...
【Vue】el 和 data短小精湛的细节!
hello,我是小索奇,精心制作的Vue教程持续更新哈,花费了大量的时间和精力,总结拓展了很多疑难点,想要学习&巩固&避坑就一起学习叭~ el 与 data 的两种写法 el共有2种写法 el表达式主要用来在模板中展示数据,它…...
前端screenfull实现界面全屏展示功能
还是先引入依赖 我们要先执行 npm config set registry https://registry.npmjs.org/将本地npm registry地址设置为官方的npm registry地址 不然这个东西安装会有点问题 然后我们执行命令安装 npm install screenfull安装完之后 我们终端执行一下 npm config delete registr…...
Dockerfile 制作常用命令总结
1.FROM( from ) : FROM : from 表示选择一个镜像作为基础镜像(在一个Dockerfile 中可以使用多条from,来构建多个镜像) 2.ENV : 用来在镜像创建出的容器中声明环境变量,如: ENV PYTHONIOENCODINGutf-8 …...
uniapp项目实践总结(十七)实现滚动触底加载
导语:在日测的开发过程中,经常会碰到页面需要渲染大量数据的情况,这时候就需要用到滚动加载功能,下面总结一下方法。 目录 原理分析实战演练案例展示 原理分析 使用scrolltolower事件来监听滚动到底部,然后加载下一…...
SAP入门到放弃系列之QM质量检验流程概述
目录 一、流程概述二、操作步骤概述2.1 主数据维护2.2 业务操作 一、流程概述 质量检验流程-Inspection Process Flow,通常由于预先设定的一些规则条件自动触发或者手工触发,例如库存地之间的调拨、生产完工入库检验、采购入库的检验、客户交货前检验等等。另外还有…...
Ansys Zemax | 光学系统设计中如何使用玻璃替换方法来优化玻璃
在光学系统中选择最优玻璃材料时,Conrady d-D以及模型玻璃等传统的玻璃选择方法提供的帮助有限。本文介绍了如何使用玻璃替换方法进行直接玻璃优化,以及在考虑玻璃的可用性、成本及耐候性等因素时,如何进一步严格挑选玻璃。 简介 玻璃替换方法…...
springboot基础--实现默认登录页面
1、搭建项目 依赖中 多加入thymeleaf依赖 <dependencies><!--thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--we…...
TDesign WXS语法
目录 一、输出函数返回值如何获取? 二、WXS语法 三、WXS案例 一、输出函数返回值如何获取? 写在js的方法中 wxml中{{方法名()}}输出: 发现不显示?? 所以不能使用这种方式!! 二、WXS语法 1.…...
Iterator设计模式
目录 1、示例 1.1 Aggregate接口 1.2 Iterator接口 1.3 Book类 1.4 BookShelf类 1.6 BookShelfIterator 类 1.7 Main类 2、解释Iterator模式中的角色 2.1 Iterator模式的存在意义 2.2 抽象类和接口 2.3 Aggregate 和 Iterator的对应 2.4 容易弄错"下一个"…...
ROS 入门
目录 简介 ROS诞生背景 ROS的设计目标 ROS与ROS2 安装ROS 1.配置ubuntu的软件和更新 2.设置安装源 3.设置key 4.安装 5.配置环境变量 安装可能出现的问题 安装构建依赖 卸载 ROS架构 1.设计者 2.维护者 3. 立足系统架构: ROS 可以划分为三层 ROS通信机制 话…...
第四章 Linux网络编程
ARP 协议 ARP 协议(Address Resolution Protocol)通过 IP 地址查找对应的 MAC 地址。 当一个主机需要发送数据给另一个主机时,它首先会检查本地的 ARP 缓存表(ARP cache)中是否存在目标主机的 MAC 地址。如果存在&…...
无涯教程-JavaScript - OFFSET函数
描述 OFFSET函数返回对范围的引用,该范围是一个单元格或单元格范围中指定的行数和列数。 返回的引用可以是单个单元格或单元格范围。您可以指定要返回的行数和列数。 语法 OFFSET (reference, rows, cols, [height], [width]) 争论 Argument描述Required/OptionalReferenc…...
rust切片
切片类型写为[T]。 切片是序列的一个片段。 它是动态大小类型,所以要使用切片类型,就必须使用它的指针类型。引用是最常用的指针类型。 [T; n]能隐式转换成[T]。 一、定义切片 (一)不可变切片 &[T],共享切片&…...
2023/9/18 -- C++/QT
作业 完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两…...
vue柱状图+折线图组合
<template><div id"main" style"width: 100%;height: 500px; padding-top: .6rem"></div> </template>data() {return {weekData: ["1周","2周","3周","4周","5周","6周&…...
js中如何实现一个简单的防抖函数?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 防抖函数⭐ 使用示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…...
mysq 主从同步错误之 Error_code 1032 handler error HA_ERR_KEY_NOT_FOUND
错误说明: MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败 (Update、Delete、Insert一条已经delete的数据)。 1032的错误本身对数据一致性没什么影…...
蓝桥杯 题库 简单 每日十题 day4
01 津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津…...
l8-d21 域名解析与http服务器实现原理
一、域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下: struct hostent { char *h_name; /* 官方域名 */ char **h_aliases; /* 别名*/ int h_addrtype; /* 地址族(地址类型) */ int h_l…...
网络安全(黑客技术)自学规划
一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性…...
阻止用邮件不停注册wordpress账户的方法
您可以使用多种不同的策略来阻止垃圾邮件注册。以下是一些策略供您参考:第1个最好用 1.完全禁用WordPress注册:如果您不需要在您的WordPress网站上公开注册,最好完全禁用注册,而不是试图打击垃圾邮件注册。要完全禁用WordPress上…...
低代码工具大比拼:哪个最适合你?
低代码开发平台正日益流行,成为企业和开发者们的首选。但是,面对市场上众多的低代码工具,你是否感到困惑呢?今天,就和数聚股份一起探讨一下,究竟应该选择哪个低代码工具才能最好地满足你的需求。 首先&…...
用Python实现链式调用
嗨喽,大家好呀~这里是爱看美女的茜茜呐 我们在使用Django的models查询数据库时,可以看到有这种写法: form app.models import XXX query XXX.objects.all() query query.filter(name123, age456).filter(salary999)在这种写法里面…...
基于SSM的汽车租赁后台管理系统
基于SSM的汽车租赁后台管理系统 介绍 包括登录、首页、客户管理、车辆管理、汽车出租、出租单管理、汽车入库、检查单管理、系统管理等功能,适合二次开发课程设计、毕业设计等 软件架构 SSM 运行环境 数据库 mysql 安装教程输入链接说明 端口:3306…...
Word 文档转换 PDF、图片
工作有需要 Word 文档转换 PDF、图片 的场景,我们来看看 Java 开发中怎么解决这个问题的。 Word 转 PDF Word 转 PDF 分为商用 Aspose 方案和开源 Apache POIiText 方案。 Aspose 方案 这种方式在目前来看应该是最好的,无论是转换的速度还是成功的概…...
解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose
参考:Docker官网-Install Docker Engine on Ubuntu 一、 Install using the Apt repository 1.1 Set up Docker’s Apt repository 1.1.1 Add Docker’s official GPG key # Add Dockers official GPG key: sudo apt-get updatesudo apt-get install ca-certifi…...
[ABC118D] Match Matching
题目传送门 引 题目的描述很形象,梦回童年,注意一下火柴全部都用完 解法 显然 DP , 设计状态: f i : 用完 i 根木棒凑出的最大数 f_i:用完i根木棒凑出的最大数 fi:用完i根木棒凑出的最大数 状态转移: f i → f i c n t …...
程序员必须掌握哪些算法?
目录 简介1. 冒泡排序(Bubble Sort)思想 2. 快速排序(Quick Sort)思想 3. 二分查找(Binary Search)思想 4. 归并排序(Merge Sort)思想 5. 插入排序(Insertion Sort&#…...
Java高级之File类、节点流、缓冲流、转换流、标准I/O流、打印流、数据流
第13章 IO流 文章目录 一、File类的使用1.1、如何创建File类的实例1.2、常用方法1.2.1、File类的获取功能1.2.2、File类的重命名功能1.2.3、File类的判断功能1.2.4、File类的创建功能1.2.5、File类的删除功能 二、IO流原理及流的分类2.1、Java IO原理2.2、流的分类/体系结构 三…...
建立企业网站的意义/网站一级域名和二级域名区别
常用排序算法总结和对比 相关术语解释: 稳定:如果a原本在b前面,而ab,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而ab,排序之后a可能会出现在b的后面;内排序&am…...
php网站平台/龙岗网站推广
赞助商链接本文“PHP Data Object 新的数据库衔接方法[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:P…...
怎样给公司申请一个网站/最近的新闻摘抄
Transformer是一种基于注意力机制的神经网络模型,由谷歌公司提出,其最初目的是用于自然语言处理任务,如机器翻译、文本摘要、语音识别等。相比于传统的循环神经网络模型,如LSTM和GRU,Transformer模型具有更好的并行化能…...
怎么做网站最便宜/如何做个人网站
团队介绍 成员 工作描述 武松桦(组长) 1 领导团队 召开团队会议 2与需求方进行联系沟通 3页面代码 王亚正 1页面代码 2测试和bug修复 3后端开发 詹元成 1服务器配置和维护 2 页面代码 3 博客撰写 尹宇飞 1页面代码 2美工制作 3博客撰写 张军 …...
wordpress部署阿里云/网络培训机构
物联网学习入门篇之MQTT协议 MQTT: Massage Queuing Telemetry Transport,消息队列遥测传输 MQTT是基于互联网的基础协议TCP/IP协议而构建的,由IBM在1999年发布,基于发布和订阅两种模式(publish/subscribe)算是一种轻量级通讯协议…...
品牌网站模板/竞价排名深度解析
2019独角兽企业重金招聘Python工程师标准>>> 转载请标明出处: http://blog.csdn.net/u011974987/article/details/50801770; 本文出自:【Xiho的博客】 概述: 简单介绍下这个需求的缘由,这段时间因公司业务需要&#x…...