Redis学习【7】之发布_订阅命令和事务
文章目录
- 一 发布/订阅命令
- 1.1 消息系统
- 1.2 subscribe
- 1.3 psubscribe
- 1.4 publish
- 1.5 unsubscribe
- 1.6 punsubscribe
- 1.7 pubsub
- 1.7.1 pubsub channels
- 1.7.2 pubsub numsub
- 1.7.3 pubsub numpat
- 二 Redis 事务
- 2.1 Redis 事务特性
- Redis 事务实现
- 2.1.1 三个命令
- 2.1.2 基本使用
- 2.2. Redis 事务异常处理
- 2.2.1 语法错误
- 2.2.2 执行异常
- 2.3 Redis 事务隔离机制
- 2.3.1 需要事务隔离机制的原因
- 2.3.2 隔离的实现
- 2.3.3 隔离的实现原理
一 发布/订阅命令
1.1 消息系统
- 发布/订阅(pub/sub),是一种消息通信模式:发布者【消息生产者】,生产和发送消息到存储系统;订阅者【消息消费者】,从存储系统接收和消费消息。这个存储系统可以是文件系统 FS、消息中间件 MQ、数据管理系统 DBMS,也可以是 Redis。 整个消息发布者、订阅者与存储系统称为消息系统。
- 消息系统中的订阅者订阅了某类消息后,只要存储系统中存在该类消息,其就可不断的接收并消费这些消息。当存储系统中没有该消息后,订阅者的接收、消费阻塞。而当发布者将消息写入到存储系统后,会立即唤醒订阅者。当存储系统放满时,不同的发布者具有不同的处理方式:有的会阻塞发布者的发布,等待可用的存储空间;有的则会将多余的消息丢失。
- 不同的消息系统消息的发布/订阅方式也是不同的。例如 RocketMQ、Kafka 等消息中间件构成的消息系统中,发布/订阅的消息都是以主题 Topic 分类的。而 Redis 构成的消息系统中,发布/订阅的消息都是以频道 Channel 分类的。
1.2 subscribe
- 格式:
SUBSCRIBE channel *channel …+
- 功能:Redis 客户端通过一个
subscribe
命令可以同时订阅任意数量的频道。在输出了订阅主题后,命令处于阻塞状态,等待相关频道的消息。
1.3 psubscribe
- 格式:
PSUBSCRIBE pattern *pattern …+
- 功能:订阅一个或多个符合给定模式的频道
- 说明:这里的模式只能使用通配符
*
。 如,it*
可以匹配所有以 it 开头的频道,如it.news、it.blog、it.tweets
;news.*
可以匹配所有以news.
开头的频道。
1.4 publish
- 格式:
PUBLISH channel message
- 功能:Redis 客户端通过一条 publish 命令可以发布一个频道的消息,返回值为接收到该消息的订阅者数量。
1.5 unsubscribe
- 格式:
UNSUBSCRIBE *channel *channel …++
- 功能:Redis 客户端退订指定的频道
- 说明:如果没有频道被指定,会执行一个无参数的
unsubscribe
命令,客户端使用SUBSCRIBE
命令订阅的所有频道都会被退订。在这种情况下,返回一个信息,告知客户端所有被退订的频道
1.6 punsubscribe
- 格式:
PUNSUBSCRIBE *pattern *pattern …++
- 功能:退订一个或多个符合给定模式的频道
- 说明:这里的模式只能使用通配符
*
。如果没有频道被指定,其效果与 SUBSCRIBE 命令相同,客户端将退订所有订阅的频道。
1.7 pubsub
- 格式:
PUBSUB <subcommand> [argument *argument …++
- 功能:
PUBSUB
是一个查看订阅与发布系统状态的内省命令集,它由数个不同格式的子命令组成
1.7.1 pubsub channels
- 格式:
PUBSUB CHANNELS [pattern]
- 功能:列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。
- 说明:pattern 参数是可选的。如果不给出 pattern 参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。pattern 中只能使用通配符*。
1.7.2 pubsub numsub
- 格式:
PUBSUB NUMSUB [channel-1 … channel-N]
- 功能:返回给定频道的订阅者数量。不给定任何频道则返回一个空列表。
1.7.3 pubsub numpat
- 格式:
PUBSUB NUMPAT
- 功能:查询当前 Redis 所有客户端订阅的所有频道模式的数量总和
二 Redis 事务
- Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。
2.1 Redis 事务特性
- Redis 的事务仅保证数据的一致性,不具有像 DBMS 一样的 ACID 特性。
- 不具备原子性:这组命令中的某些命令的执行失败不会影响其它命令的执行,不会引发回滚。
- 没有复杂的隔离级别:这组命令通过乐观锁机制实现了简单的隔离性。
- 与事务无关:这组命令的执行结果是被写入到内存的,是否持久取决于 Redis 的持久化策略。
Redis 事务实现
2.1.1 三个命令
- Redis 事务通过三个命令进行控制。
- muti:开启事务
- exec:执行事务
- discard:取消事务
2.1.2 基本使用
- 下面是定义并执行事务的用法:事务执行后,再访问事务中定义的变量,其值是修改过后。
- 下面是定义但取消事务的举例:事务取消后,事务中的命令是没有执行的
2.2. Redis 事务异常处理
2.2.1 语法错误
- 当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消
2.2.2 执行异常
- 如果事务中的命令没有语法错误,但在执行过程中出现异常,该异常不会影响其它命令的执行。
2.3 Redis 事务隔离机制
2.3.1 需要事务隔离机制的原因
- 在并发场景下可能会出现多个客户端对同一个数据进行修改的情况,造成数据不一致的情况!
- 如:有两个客户端 C 左与 C 右,C 左需要申请 40 个资源,C 右需要申请 30 个资源。它们首先查看了当前拥有的资源数量,即 resources 的值为50,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。
- 如:有两个客户端 C 左与 C 右,C 左需要申请 40 个资源,C 右需要申请 30 个资源。它们首先查看了当前拥有的资源数量,即 resources 的值为50,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。
- Redis 事务通过乐观锁机制实现了多线程下的执行隔离
2.3.2 隔离的实现
- Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离
- 以上两个客户端执行的时间顺序为:
2.3.3 隔离的实现原理
- 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。
- 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是version 的初值 1.0。
- 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
- 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行
相关文章:
Redis学习【7】之发布_订阅命令和事务
文章目录一 发布/订阅命令1.1 消息系统1.2 subscribe1.3 psubscribe1.4 publish1.5 unsubscribe1.6 punsubscribe1.7 pubsub1.7.1 pubsub channels1.7.2 pubsub numsub1.7.3 pubsub numpat二 Redis 事务2.1 Redis 事务特性Redis 事务实现2.1.1 三个命令2.1.2 基本使用2.2. Redi…...
MySQL8.0 optimizer_switch变化
Optimizer_switch变量是支持对优化器行为的控制。是一组值标志,每个标志都有一个on或off的值,以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外,其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…...
Web--Maven
1.maven管理项目的区别 2. 安装后,conf目录下的setting文件中,对本地仓库的配置 此处可替换成自定义的本地仓库地址,默认为c:/user/17860/.m2/repository(我的电脑上的) 3.maven项目的标准目录结构 4.项目的生命周期 5.Maven概…...
深入理解MySQLⅢ -- 锁与InnoDB引擎
文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源&#x…...
Win11电脑速度慢、延迟高怎么办?
作为新版的系统,Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢,还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉,那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时࿰…...
【双指针问题】977. 有序数组的平方
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
Meta AR眼镜主管:正开发史无前例的AR,但要解决很多困难
前不久,Meta CTO Andrew Bosworth在个人博客上“怒斥”公司内部不够专注,应该将资源投入在有核心竞争力、高投资回报率的业务上,而不是开发取悦用户却不赚钱的产品。尽管删除一些小众功能后,用户可能会不满,但为了让Me…...
Docker 搭建KingbaseES主备流复制
author: aming email: jikcheng163.com title: Docker 安装KingbaseES读写分离集群 creation_date: 2023-02-16 13:59 Last modified date: 2023-02-16 19:18 tags: Docker 安装KingbaseES读写分离集群 File Folder with relative path: reading notes/doc/Docker技术入门与实战…...
java易错题锦集四
effective java 不要再构造方法中启动任何线程 g new GameServer(); g.start();构造器无返回值,但是不能void修饰 字符串 String是包装类型吗?答案: 不是 对应的基本类型和包装类如下表: 基本数据类型 包装类 byte Byte bool…...
每天10个前端小知识 【Day 17】
前端面试基础知识题 1.使用原生js实现以下效果:点击容器内的图标,图标边框变成border:1px solid red,点击空白处重置 const box document.getElementById(box); function isIcon(target) { return target.className.includes(icon); } b…...
Python语言零基础入门教程(二十三)
16、Python os.fpathconf() 方法 概述 os.fpathconf() 方法用于返回一个打开的文件的系统配置信息。 Unix上可用。 语法 fpathconf()方法语法格式如下: os.fpathconf(fd, name)参数 fd – 打开的文件的描述符。 name – 可选,和buffersize参数和Pyt…...
[ansible系列]ansible使用扩展
目录 一. 本地执行 二. 任务委托 三. 任务暂停 四. 滚动执行 五. 只执行一次 六. 设置环境变量 七. 交互提示 一. 本地执行 我们知道ansible的是操作被控端的,所有执行的动作都是在被控端上完成的,当然在某些特定的时候我们想要有些tas…...
Java工具类(时间格式转换)
import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL 0 * DateFormat.DEFAULT 2 * DateFormat.LONG 1 * DateFormat.MEDIUM 2 * DateFormat.SHORT 3 * author Michael * version 1.0, 2007/03/09 */ public c…...
数据库(第五次作业)
1.1 Redis概述 1.1.1 什么是Redis 2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据…...
代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
110. 平衡二叉树 题目链接 题目描述: 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...
套娃式工具!用 AI 识别 AI ?#AI classifier
2022年以来,市面上就出现了不少 AI 生成文本的工具,尤其是 OpenAI 推出的 ChatGPT ,不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务,还能通过学习和理解人类的语言来进行对话,并根据聊天的上下文进行互动…...
CURL error 60: SSL certificate problem: certificate has expired
项目使用guzzleHttp做的一个接口,报错:certificate has expired 因为在linux centos环境与window环境有所不同,在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...
接口自动化:requests
引言:目前软件测试对测试人员的能力要求 业务测试能力:占比5-6成接口、自动化、性能测试能力:占比4-5成流程规范:1成(需要综合型的测试人才):业务能力、代码能力、开发思维(封装&…...
极简TypeScript教程--数据类型
TypeScript最大的特点就是有类型检测,格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型,就会在编译期报错。变量的类型推导在开发中,有时候为了方便起见…...
JAVA开发测试(jmeter如何测试性能与估算)
对C的业务网站或应用,进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具: Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能,是Apache组织开发的…...
【新解法】华为OD机试 - 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供
华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供 题目 已知连续正整数数列{K}=K1,K2,K3… Ki的各个数相加之和为S, i = N (0 < S < 100000, 0 < N < 100000), 求此数列K。 输入 输…...
Python3 File(文件) 方法
Python3 File(文件) 方法 open() 方法 Python open() 方法用于打开一个文件,并返回文件对象。 在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。 注意:使用 open() 方法一定要保证关闭文件对…...
APP渗透抓包
APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…...
力扣(LeetCode)414. 第三大的数(2023.02.16)
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。 示例 2: 输入:[1, 2] 输出:2…...
Spring底层
一、什么是Spring?谈谈你对IOC和AOP的理解。Spring: 是一个企业级java应用框架,他的作用主要是 简化软件的开发以及配置过程,简化项目部署环境。Spring的有点:1、Spring低侵入设计,对业务代码的污染非常低。…...
Cache-Control 常见字段
Cache-Control 常见字段 参考:https://blog.csdn.net/qq_41996454/article/details/108644436 Cache-Control 可以在请求头或者响应头中设置,并且可以组合使用多种指令 no-cache 和 no-store 用作控制缓存,被服务器通过响应头 Cache-Contro…...
Flink Checkpoint 中的通用增量Checkpoint
文章目录知识点状态Flink容错恢复周期性的 Checkpoint错误检测 Failure Detected重新调度 Re-scheduling状态恢复 State Recovery通用增量Checkpoint知识点 状态 算子需要记录之前数据处理的中间结果,把中间结果暂时缓存在算子的内部,这就是算子的状态…...
金三银四必看的软件测试面试题宝典,背完offer随便拿
怎么来设计测试方案根据测试需求(包括功能需求和非功能性需求),识别测试要点,识别测试环境要求,安排测试轮次,根据项目计划和开发计划做整体的测试安排。 被测试的特性:通过对需求规格说明书进行…...
企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…...
扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!
组织以为,数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日,国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济,加速实施“东数西算”等重大工程,推进数…...
给你一个网站怎么做性能测试/seo优化神器
在IBatis中我们可以灵活的选择DAO类型,也就是可以在底层选用不同的数据库操作方式。有常规方式、配置文件的方式、Hibernet的方式等:1、常规方式和我们之前的ADO.NET开发较为类似,都是将sql语句写在cs代码中进行调用:首先通过配置…...
济南网站建设 伍际网络/哪里有免费的网站推广服务
可量化的软件项目质量考核指标说明关键字:软件项目质量考核有一个完整的指标体系,从可行易操作的角度出发,评价一个软件项目质量情况,可以从以下几个方面出发,获取比较客观的评价指标。指标内容说明如下。1 小组考核内…...
怎么做网站卖保险/域名信息查询
1.什么字符串会进入字符串常量池 1. 直接写的字面量 2. 字面量的拼接结果(注意:如果字符串拼接中有变量则结果不会进入字符串常量池) 3. 调用String的intern方法可以将String存入字符串常量池 2. 字面量的拼接原理 有如下列展示代码&…...
用wordpress做的站点/seo交流
今日介绍编写Windows窗口图形界面程序的准备工作:创建模板。大约30分钟,你就会啦。不用MFC说明:不用MFC,这是和很多其他课程、很多教科书不同的。我们采用的方式是:使用Windows API。通过这种方式,使用C编写…...
vr哪家公司做得好/武汉seo网站排名优化公司
通过上一节的学习,我们知道了什么是 ACL 权限,也了解了如何配置linux系统使其开启 ACL 权限,本节来学习 ACL 设定文件访问权限的具体方法。设定 ACl 权限,常用命令有 2 个,分别是setfacl和getfacl命令,前者…...
网站开发教程视频百度云资源/搜索引擎优化seo是什么
今天终于得空,去影院贡献了一波,《前任3》 ,看完后,总想说点什么,那就用文字记下吧。和基友去看,气氛并不如我所料那般尬,反倒被余飞和丁点这对活宝逗得停不下来,然而在他们衬托下&a…...