Redis学习【7】之发布_订阅命令和事务

news2024/10/2 3:57:31

文章目录

  • 一 发布/订阅命令
    • 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.tweetsnews.*可以匹配所有以 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,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。
      在这里插入图片描述
  • Redis 事务通过乐观锁机制实现了多线程下的执行隔离

2.3.2 隔离的实现

  • Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离
    在这里插入图片描述
  • 以上两个客户端执行的时间顺序为:
    在这里插入图片描述

2.3.3 隔离的实现原理

  1. 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。
  2. 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是version 的初值 1.0。
  3. 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
  4. 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行
    在这里插入图片描述

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

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

相关文章

家用洗地机哪款质量好?洗地机排行榜

伴随着人们消费水平和生活品质的提升&#xff0c;人们对家庭中的需求也随之提高&#xff0c;洗地机凭借着吸拖洗为一体的功能深受大众喜爱&#xff0c;但是市面上洗地机产品越来越多&#xff0c;清洁效果也参差不齐&#xff0c;到底哪款洗地机质量好呢&#xff0c;跟随笔者脚步…

FILE文件操作

文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区&#xff0c;用来存放文件的相关信息&#xff08;如文件的名 字&#xff0c;文件状态及文件当前的位置等&#xff09;。这些信息是保存在一个结构体变量中的。该结构体类型是有系统 声明的&#xff0c;取名FILE…

ecaozzz

2. 图形报表ECharts 2.1 ECharts简介 ECharts缩写来自Enterprise Charts&#xff0c;商业级数据图表&#xff0c;是百度的一个开源的使用JavaScript实现的数据可视化工具&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/…

面试完阿里,字节,腾讯的测试岗,复盘以及面试总结

前段时间由于某些原因辞职了&#xff0c;最近一直在面试。面试这段时间&#xff0c;经历过不同业务类型的公司&#xff08;电商、酒店出行、金融、新能源、银行&#xff09;&#xff0c;也遇到了很多不同类型的面试官。 参加完三家大厂的面试聊聊我对面试的一些看法&#xff0…

AWS攻略——子网

文章目录分配子网给Public子网分配互联网网关创建互联网网关附加到VPC给Public子网创建路由表关联子网打通Public子网和互联网网关创建Public子网下的EC2进行测试配置Private子网路由给Private子网创建路由表附加在Private子网创建Private子网下的EC2进行测试创建实例在跳板机上…

Mybatis 之useGeneratedKeys注意点

一.例子 Order.javapublic class Order {private Long id;private String serial; }orderMapper.xml<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd…

java学习--多线程

多线程 了解多线程 ​ 多线程是指从软件或者硬件上实现多个线程并发执行的技术。 ​ 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 并发和并行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在CPU上同时执行并发&#xff1…

20230217使AIO-3399J开发板上跑通Android11系统

20230217使AIO-3399J开发板上跑通Android11系统 2023/2/17 15:45 1、解压缩SDK&#xff1a;rk3399-android-11-r20211216.tar.xzrootrootrootroot-X99-Turbo:~$ tar xvf rk3399-android-11-r20211216.tar.xz 2、编译U-boot&#xff1a; rootrootrootroot-X99-Turbo:~/rk3399-a…

没有接口文档的怎样进行接口测试

前言&#xff1a; 在进行接口测试之前&#xff0c;一般开发会提供接口文档&#xff0c;给出一些接口参数和必要熟悉&#xff0c;便于我们编写接口脚本。但如果没有提供接口开发文档的请求下&#xff0c;我们该如何编写接口测试脚本呢&#xff1f;在编写测试脚本前要做哪些必要…

一台电脑安装26个操作系统(windows,macos,linux)

首先看看安装了哪些操作系统1-4: windows系统 四个5.Ubuntu6.deepin7.UOS家庭版8.fydeOS9.macOS10.银河麒麟11.红旗OS12.openSUSE Leap13.openAnolis14.openEuler(未安装桌面UI)15.中标麒麟&#xff08;NeoKylin&#xff09;16.centos17.debian Edu18.fedora19.oraclelinux20.R…

CCNP350-401学习笔记(1-50题)

1、Which function does a fabric edge node perform in an SD-Access deployment?A. Connects endpoints to the fabric and forwards their traffic. B. Encapsulates end-user data traffic into LISP. C. Connects the SD-Access fabric to another fabric or external La…

YOLOv5:GitHub两万八Star项目

来源&#xff1a;投稿 作者&#xff1a;王同学 编辑&#xff1a;学姐 Yolov5详解 官方源码仓库&#xff1a;https://github.com/ultralytics/yolov5 相关论文&#xff1a;未发表&#xff08;改进点都被你们抢先发了&#xff09; 0 前言 截止到2022年7月&#xff0c;Yolov5项…

docker目录迁移流程

概述 在安装测试最新版本的HOMER7的过程中&#xff0c;docker作为基础工具碰到一些问题&#xff0c;针对问题进行总结。 docker的默认工作目录在/var目录&#xff0c;而在我们的环境中&#xff0c;/var目录空间预留不足&#xff0c;随着docker的运行&#xff0c;/var目录空间…

WiFi网络带宽、流量监控管理

当您的组织拥有越来越多的有线和无线设备时&#xff0c;有必要在预算、性能和安全性之间取得准确的平衡。尽管无线设备可以为用户提供灵活性&#xff0c;但鉴于其动态性质&#xff0c;发现和管理这些设备可能极具挑战性。 为用户提供功能性无线网络性能&#xff0c;同时确保没…

Spire.Office 8.2.2 for NET 开年之喜

Spire.Office for .NET对文档的操作包括打开&#xff0c;创建&#xff0c;修改&#xff0c;转换&#xff0c;打印&#xff0c;浏览 Word、Excel、PowerPoint 和 PDF 文档&#xff0c;以及将数据从数据源导出为常用的文档格式&#xff0c;如&#xff1a;Word&#xff0c;Excel&a…

每天10个前端小知识 【Day 16】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…

【老王读Spring Transaction-6】spring-tx与DataSource连接池整合的原理

06spring-tx与DataSource连接池的原理前言Spring 版本正文事物连接: Spring-managed transactional Connectionsspring-tx 与 DataSource 的整合SpringBoot 默认使用的 DataSource 连接池是 Hikari事物连接的关闭/释放: 并不是真正的关闭小结前言 javax.sql.DataSource 是 jav…

2月,还是不要跳槽

新年已经过去&#xff0c;马上就到金三银四跳槽季了&#xff0c;一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必…

十四、vue3项目如何使用three.js

近期在开发过程中&#xff0c;因为项目已经接近尾声&#xff0c;就需要对项目中的数据进行整合&#xff0c;而数据看板不失为一个比较直观的展现形式。在数据看板中3D的展现形式是比较流行的展现形式&#xff0c;那么如何在项目引入一个大的场景&#xff0c;并且能够和后台发生…

【NGINX入门指北】Nginx Web 架构实验

Nginx Web 架构实验 文章目录Nginx Web 架构实验一、动态网站结构二、LNMP 动态网站环境部署三、fastcgi & php-fpm&#xff1a;四、php-fpm初始化配置五、Nginx Location、六、Nginx Rewrite七、CA&HTTPS八、Nginx 的平滑升级一、动态网站结构 资源 资源文件识别——…