【Redis】redis事务和发布订阅

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的特性:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

示例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

127.0.0.1:6379(TX)> set name redis
QUEUED
127.0.0.1:6379(TX)> get name
QUEUED
127.0.0.1:6379(TX)> SADD tag "redis in actions"
QUEUED
127.0.0.1:6379(TX)> SMEMBERS tag
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) "redis"
3) (integer) 1
4) 1) "redis in actions"
127.0.0.1:6379> 

需要注意的是,单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。(TX 是transaction的意思)

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。这与MySQL中的事务是有所差别的。 示例如下:

127.0.0.1:6379(TX)> set a aaa
QUEUED
127.0.0.1:6379(TX)> set b bbb 
QUEUED
127.0.0.1:6379(TX)> set c ccc
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) OK127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> DISCARD
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> 

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。同时注意discard是放弃事务的意思。

Redis 事务命令

下表列出了 redis 事务的相关命令:

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

Redis 发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (publisher) 发送消息,订阅者 (ssubscriber) 接收消息。Redis 客户端可以订阅任意数量的频道(channel)。

redis发布订阅的通信模型有如下特点:

  • RedisServer中可以创建多个channel
  • 一个订阅者可以订阅多个channel
  • 当发布者向一个频道中发布一条消息时,所有的订阅者都将会收到消息
  • Redis的发布订阅模型没有消息积压功能,即新加入的订阅者收不到发布者之前发布的消息
  • 当订阅者收到消息时,消息内容如下:
    • 第一行:固定内容message
    • 第二行:channel的名称
    • 第三行:收到的新消息

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
在这里插入图片描述
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
在这里插入图片描述
示例
以下例子演示了发布订阅是如何工作的,需要开启两个 redis-cli 客户端。在这个例子中我们创建了订阅频道名为 goodschat:
第一个 redis-cli 客户端

127.0.0.1:6379> SUBSCRIBE goodschat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "goodschat"
3) (integer) 1

现在,我们先重新开启个 redis 客户端,然后在同一个频道 goodschat 发布两次消息,回过头去看订阅者就能接收到消息。

第二个 redis-cli 客户端

127.0.0.1:6379> PUBLISH goodschat "hello ,welcome to learn redis"
(integer) 1
127.0.0.1:6379> PUBLISH goodschat "you have to study hard"
(integer) 1
127.0.0.1:6379> 

订阅者的客户端会显示如下消息

1) "message"
2) "goodschat"
3) "hello ,welcome to learn redis"
1) "message"
2) "goodschat"
3) "you have to study hard"

Redis 发布订阅命令

下表列出了 redis 发布订阅常用命令:

命令说明
PSUBSCRIBE pattern [pattern …]订阅一个或多个符合给定模式的频道。
PUBSUB subcommand [argument [argument …]]查看订阅与发布系统状态。
PUBLISH channel message将信息发送到指定的频道。
PUNSUBSCRIBE [pattern [pattern …]]退订所有给定模式的频道。
SUBSCRIBE channel [channel …]订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel …]]指退订给定的频道。

消息队列和发布订阅区别

发布订阅模式是将消息通知每一个订阅者,正常情况下回收到完全相同的消息。而消息队列是消息发布者发表消息后只有其中一个消息订阅者能收到消息,订阅者争抢接受消息,实现的是一个抢的功能。

更多关于redis的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

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

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

相关文章

卸载云服务器上的 MySQL 数据库

执行以下命令以停止 MySQL 服务: sudo service mysql stop执行以下命令以彻底卸载 MySQL: sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean 这将删除 MySQL 数据库服务器、客…

C++设计模式——抽象工厂模式

文章目录 抽象工厂模式的主要组成部分抽象工厂模式的一个典型例子抽象工厂模式用于其他场景抽象工厂模式与其他设计模式结合使用 C 中的抽象工厂模式是一种创建型设计模式,它主要用于处理对象家族的创建,这些对象之间可能存在一定的关联关系或属于相同的…

国产航顺HK32F030M: HK32F030MJ4M6_SOP8资料

最小系统 参考资料 [1] 航顺MCU HK32F030MJ4M6-SOP8 各个文件夹简介: Boards:HK32F030xMF4P6开发板的BSP驱动代码。 Documents:HK32F030xMxx数据手册、用户手册、API手册以及HK32F030xMxx开发板原理图。 Package:HK32F030xMxx Ke…

React.FC详细解说

React.FC 是 React 中的一个泛型,用于定义函数式组件(Functional Component)。在 TypeScript 中,React.FC 可以帮助开发者进行类型推导,使得编写 React 组件更加方便。 React.FC 的定义如下: typescript复…

任务系统之API子任务

日常运维工作中有许多的任务要执行,例如项目发布/数据备份/定时巡检/证书更新/漏洞修复等等,大部分的任务都会有多个步骤共同完成,例如一个发布任务会有拉代码、编译、分发、通知等等步骤,而不同的任务可能还包含相同或相似的步骤…

PRL算法调控

伴随汽车电子技术发展,传统轮式车辆制动系统的气体或液体传输管路长,阀类原件多原有的真空助力系统无法兼顾车辆的再生制动功能,而再生制动功能是混合动力车辆是混动车辆最主要的市场优势之一,真空助力器逐渐被eBooster 所取代。针…

微信小程序 - 渲染和逻辑

通信模型 渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。 数据驱动 WXML会解析对应model值,并生成js对象,最后生成最终的dom树。 当model发生变更时候,会判断解析wxml后的js对象是否改动,若改动…

[重磅更新] Mac玩游戏必备!Crossover24版现已上线!附免费升级攻略 Crossover软件使用方法安装程序 免费版

好久不见啦,最近一直在忙着研究Mac玩游戏,什么幻兽帕鲁、女神异闻录之类的,有些沉迷了,实在对不住大家… 不过今天还是给大家带来了好消息!那就是让Mac玩游戏不再是笑话的神器,Crossover正式发布了2024版&a…

使用CANoe进行27服务安全认证解密算法

方法:通过cdd文件dll文件进行27服务通过安全认证解密 步骤1:菜单栏选中Diagnostics&XCP这一栏, 步骤2:鼠标左击CANdelaStudio 步骤3:弹出如下弹窗,选择 I accept 步骤4:选择新建 步骤5&…

下载nvm注意事项

不能在有空格的文件夹里面!!!!!!并且需要将原先有的node卸载! (去控制面板下卸载) 我原先下在了Program Files里面 安装参考: nvm安装,nvm的使…

redis-Redis主从,哨兵和集群模式

一,Redis的主从复制 ​ 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。这样做的好处是读写分离,性能扩展,容灾快速恢复。 1.1 环境搭建 如果你的redi…

ModStartCMS v8.1.0 图片前端压缩,抖音授权登录

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

学习JAVA的第十天(基础)

目录 API之Math 获取绝对值 向上取整 向下取整 四舍五入 获取两个整数的较大值 获取两个整数的较小值 获取平方根 获取立方根 获取一个数的几次幂 获取随机数 API之System 终止当前运行的JAVA虚拟机 返回当前系统的时间毫秒值 数组拷贝 API之Runtime 获取Runt…

websocket 通用类封装和使用

websocket 工具类封装 export default class SocketService{static instancenull;static get Instance(){if(!this.instance){this.instancenew SocketService();}}wxnull;callBackMapping{};connectedfalse;sendRetryCount0;connectRetryCount0;connect(){if(!window.WebSock…

手机AI摄影时代开启,传音引领行业标准化建设

今年春节,AI摄影可谓大出风头。人们在社交平台晒出自己在龙年的AI写真,极大地增添了节日的氛围感,也让我们看到了“AI摄影”的价值。新年伊始,手机巨头们纷纷布局该赛道,基于AI大模型实现的影像功能成为业界关注焦点。…

Go编译DLL与SO

1. 简介 将Go编译成DLL/SO供其他语言调用。 .DLL&#xff1a;文件是 Windows 操作系统的动态链接库文件。.SO 文件是 Unix、Linux 和其他类 Unix 系统的共享库文件。 2. Go编译DLL/SO 注意 export后面导出的方法名一定要大写。 package main/* #include <stdlib.h>…

Java Web(十)--jQuery

介绍 官网文档&#xff1a;jQuery 教程 jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm 下载地址&#xff1a;https://jquery.com/download/%20jQuery jQuery 是一个快速的&#xff0c;简洁的 javaScrip工具库&#xff0c;使用户能更方…

C语言 变量

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型&#xff0c;类型决定了变量存储的大小和布局&#xff0c;该范围内的值都可以存储在内存中&#xff0c;运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头…

全网最新的软件测试面试八股文

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧…

一、前端开发

#视频链接&#xff1a;https://www.bilibili.com/video/BV1rT4y1v7uQ?p1&vd_source1717654b9cbbc6a773c2092070686a95 前端开发 前端开发1、快速开发网站2、浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title(head)2.3 标题2.4 div和span练习题2.5 超链接…