Redis发布订阅及事务管理

目录

1.1 发布订阅

1.1.1 什么是发布订阅

1.1.2 常用命令

1.1.3 示例演示

1.2 事务管理

1.2.1 事务定义

1.2.2 Multi、Exec、discard

1.2.3 示例

1.2.4 事务的错误处理

1.2.5 事务的冲突问题

1.2.5.1 事务场景

1.2.5.2 悲观锁

1.2.5.3 乐观锁

1.2.5.4 事务解决冲突(WATCH)

1.2.5.5 unwatch

1.2.6 Redis事务的三个特征


1.1 发布订阅

1.1.1 什么是发布订阅

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

img

        当有新的消息通过 PUBLISH 命令发送给频道 channel1 时,这个消息就会被发送给订阅的三个客户端

img

1.1.2 常用命令

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

1.1.3 示例演示

创建四个客户端Cli_1~Cli4

#cli1 创建订阅的频道redisChat
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1#cli2 在同一频道redisChat 发布消息
127.0.0.1:6379> PUBLISH redisChat "SendMessage_1"
(integer) 1
#此处可切换到 cli1内查看是否读取到cli2发布的消息#cli3 在同一频道redisChat 发布消息
127.0.0.1:6379> PUBLISH redisChat "SendMessage_2"
(integer) 1
#此处可切换到 cli1内查看是否读取到cli3发布的消息#cli4 创建订阅的频道redisChat
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1#cli3 在同一频道redisChat 发布消息
127.0.0.1:6379> PUBLISH redisChat "SendMessage_2"
(integer) 1
#此处可切换到 cli1及cli4内查看是否读取到cli3发布的消息
cli1收到3条信息 分别来自于 cli2一次  以及 cli3两次
cli4收到1条信息 cli3一次

1.2 事务管理

1.2.1 事务定义

        Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行行事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

        Redis 事务的主要作用就是串联多个命令防止别的命令插队

1.2.2 Multi、Exec、discard

        从输入Multi命令开始,后面输入的数量命令都会一次进入到命令队列当中,但是不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行

        组队过程中,可以通过 discard 来放弃组队

image-20220719113832106

Redis的事务可以一次执行多条命令

        批量操作在发送 Exec 命令前被放入队列缓存

        收到 Exec 命令后,进入事务执行,如果事务中有任意命令执行失败,其余的命令依旧会执行

        在事务的执行过程中,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求,不会插入到事务执行的命令序列中

1.2.3 示例

#组队阶段成功、提交成功的情况
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK#组队阶段报错、提交必然报错(所有数据全部回滚)
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> set k4
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.#组队阶段成功、提交时发现组队命令有异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> incr k3
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "v3"

1.2.4 事务的错误处理

        组队时某个命令出现了错误报告,执行时整个的队列都会被取消

image-20220719114521604

        执行时某个命令报错,则只有报错的命令不会被执行,而其他命令都会执行,不会回滚

image-20220719114548697

1.2.5 事务的冲突问题

1.2.5.1 事务场景

        有一账户余额为10000元,现在出现三个请求,第一个请求想给金额-8000元,第二个请求想给金额-5000元,第三个请求想给金额-1000元

        如果没有事务管理,则有可能出现如下场景

image-20220719121307625

1.2.5.2 悲观锁

        悲观锁(Pessimistic Lock)顾名思义,就是很悲观。每次去拿数据时都认为别人会修改,所以在每次拿数据时都会上锁,这样别人想拿到这个数据就会停顿,直到它拿到锁为止。在传统的关系型数据库内就会用到这种锁机制,比如 行锁 表锁 读锁 写锁,都是在操作之前先进行上锁处理

image-20220719121359881

1.2.5.3 乐观锁

        乐观锁(Optimistic Lock)顾名思义,就是很乐观。每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的

image-20220719121620157

1.2.5.4 事务解决冲突(WATCH)

        在执行multi之前,先执行 watch key1 [key2 ....] 用于指定key的监视,如果在事务执行前这些key被其他命令锁改动,那么事务将被打断

#cli1
set money 10000
#cli2
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 8000
QUEUED
#cli3
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 3000
QUEUED#cli2
exec
#cli3
exec

1.2.5.5 unwatch

        用于取消命令对所有key的监视

        如果在执行 watch 命令之后,Exec 或 DisCard 命令先被执行的话,那么就不需要再次执行 unwatch

1.2.6 Redis事务的三个特征

单独的隔离操作事务中所有命令都会序列化,按顺序执行。事务在执行过程中,不会被其他客户端发来的请求所打断
没有隔离级别的概念队列中的命令没有提交前都不会被实际执行,因为事务提交前,所有指令都是处于等待状态
不保证原子性事务中如果有一条命令执行失败,其后命令以及会执行,并且不会回滚

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

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

相关文章

详解C++类和对象(下)完结篇

文章目录 写在前面1. 进一步认识构造函数1.1 初始化列表1.2 初始化列表的特性1.3 explicit关键字 2. static成员变量和static成员函数2.1 static成员的概念2.2 static成员的特性 3. 友元3.1 友元函数3.1 友元类 4. 内部类5.匿名对象 写在前面 本篇文章详细介绍了C类和对象中几…

vector类的模拟实现

实现基本的vector框架 参考的是STL的一些源码&#xff0c;实现的vector也是看起来像是一个简略版的&#xff0c;但是看完能对vector这个类一些接口函数更好的认识。 我们写写成员变量&#xff0c;先来看看STL的成元变量是那些 namespace tjl {template<class T>class …

作业2.7

C基础补习测试题 一、选择题&#xff08;每题2分&#xff0c;共 50 分&#xff09; C语言中&#xff0c;运算对象必须是整型数的运算符是 A 。 A、% B、/ C、%和/ D、* 若有关系x≥y≥z,应使用 A C语言表达式。 A、(x>y)&&(y>z)…

python环境配置(操作简单)

文章目录 下载文件链接过时请私信我 安装python3.9.0下载安装步骤安装python3.9.0步骤 安装pyCharm2023.3.3下载链接安装方法 激活激活链接激活方法 创建项目出现问题 下载文件 链接过时请私信我 链接&#xff1a;https://pan.baidu.com/s/1ORuhvSbBoTxeQfnYhOuiFA?pwd3oan …

Java应用中各类环境变量的优先级及最佳实践

1.引言 Java应用程序的开发和部署过程中&#xff0c;合理利用各类环境变量是关键之一。不同类型的环境变量&#xff0c;如系统环境变量、进程级环境变量、Java启动参数设置的系统属性以及Spring Boot配置文件中的环境变量&#xff0c;它们之间存在优先级差异。 深入理解这些环…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…

27/100两数相除(位移todo)

题目 27/100两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 …

【新书推荐】6.4节 标志寄存器

本节内容&#xff1a;8086 CPU内的标志寄存器FLAG为16位寄存器。本节我们将讲述FLAG寄存器各个标志位的使用方法。 ■标志寄存器的标志位&#xff1a;标志位可以分为6个状态标志位和3个控制标志位&#xff0c;此外还有7个保留的标志位。状态标志位用来记录算术逻辑运算的结果。…

C# CAD交互界面-自定义面板集(四)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集&#xff08;PaletteSet&#xff09;的C#命令方法实现。该方法名为CreatePalette&#xff…

Nacos(2)

Nacos部署 服务器端docker部署&#xff08;需要服务器安装好docker&#xff09; 导入sql文件到服务器编写nacos配置文件custom.env&#xff08;示例如下&#xff0c;改为自己服务器nacos相关信息&#xff09; PREFER_HOST_MODEhostname MODEstandalone SPRING_DATASOURCE_PL…

Git介绍和常用命令说明

目录 一、Git概述 1.1 Git是什么 1.2 Git有什么用 1.3 Git仓库介绍 二、Git下载与安装 三、Git代码托管服务&#xff08;远程仓库&#xff09; 四、Git常用命令 4.1 设置用户信息 4.2 获取Git仓库 4.2.1 本地初始化Git仓库 4.2.2 从远程仓库克隆 4.3 本地仓库操作 …

CentOS7如何安装宝塔面板并实现固定公网地址远程访问

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…