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事务的三个特征

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址:https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址:CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布&#x…

PYthon进阶--网页采集器(基于百度搜索的Python3爬虫程序)

简介:基于百度搜索引擎的PYthon3爬虫程序的网页采集器,小白和爬虫学习者都可以学会。运行爬虫程序,输入关键词,即可将所搜出来的网页内容保存在本地。 知识点:requests模块的get方法 一、此处需要安装第三方库reques…

SaperaCamExpert(相机专家)中文使用指南

参考:SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing:预处理 Tools: 快捷键:新建;打开;保存;帮助Device窗体属性树图像…

算法day11

算法day11 239 滑动窗口最大值237 前K个高频元素栈与队列总结 滑动窗口最大值 第一想法,暴力解:这个解法会超时。(这就是为啥是困难题) 思路:每到一个新的窗口,就重新进行一次窗口中的max迭代&#xff0c…

【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?

SpringBoot 底层如何去和 MySQL 交互了呢? 我们在写做 Java 项目时,一般都是引入 MyBatis 框架来和 MySQL 数据库交互,如果需要在 MySQL 上执行什么语句,只需要在 Mapper.xml 文件中定义对应的 SQL 语句即可 那么他底层到底是如…

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决

ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…

如何扩容C盘?6种扩展C盘方法!

1.C盘可以扩大吗? 因为C盘是系统盘,所以没有足够的空间会导致电脑变慢,影响程序或游戏的运行。新电脑C盘可能有足够的可用空间,但随着对电脑的使用,应用程序安装的越来越多。即便很多程序安装到D盘,但某些…

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题:塑瓷后的牙冠要比完成的牙冠大() A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇:学习成长收获:2023年度总结数据:2024新领域的探索:日常和自己的感慨:2024憧憬和规划:创作纪念日总结: 学习成长机遇: 大家好&#x…

Redis持久化、主从与哨兵架构详解

Redis持久化、主从与哨兵架构详解 Redis持久化 RDB快照(snapshot) 在默认情况下,Redis将内存数据库快照保存进名字为dump.rdb的二进制文件中 可以对redsi进行设置,让他在N秒内数据集至少有M个改动了,这一条件被满足…

【洛谷】P1596Lake Counting S(BFS解决连通性问题模板)

杂谈 大部分与检验连通性有关的题目,都可以归结为一个迷宫问题,那么就是 bfs 问题,可以查看一下笔者最近几篇用搜索方法解决连通性问题的题解,其中 bfs 解决的步骤十分固定,甚至可以说几道题的代码几乎一样&#xff…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路:深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

posix_memalign 与 malloc 对比

1. 原因原理 编程中的类型对齐问题主要是处于性能考虑,如果不做对齐,那么单个数据元素的访问很容易跨在多个时钟周期上,从而导致性能下降。 内建数据类型的对齐,是由编译器和C语言库的API实现中自动完成的,这对于用户是…

红队打靶练习:HEALTHCARE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 gobuster cms sqlmap 爆库 爆表 爆列 爆字段 FTP 提权 信息收集 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Inte…

Vision Transformer(二):位置嵌入向量

1. 什么是位置嵌入向量 位置嵌入向量是Transformer兴起时就引入的一个概念。早期在处理文本信息时,词语之间是相关联的,只有具有一定位置关系的词语组合才能够表达一些正确的意思。 2. 在Transformer中是如何实现的? 在Transformer的训练过…

ubuntu22.04@laptop OpenCV Get Started: 000_hello_opencv

ubuntu22.04laptop OpenCV Get Started: 000_hello_opencv 1. 源由2. Hello OpenCV2.1 C应用Demo2.2 Python应用Demo 3. 参考资料 1. 源由 之前,通过敲门砖已经砸开了OpenCV的大门,接下来是体验下“Hello World!”程序。 2. Hello OpenCV …

洗地机值得买吗?四款好用的洗地机推荐

洗地机值得买吗,相比传统清洁工具而言,洗地机的优势明显,甚至可以说是代差级的优势。它可以一机多用,在扫地、拖地、滚刷自清洁、烘干/晾干上一次完成,不仅清洁能力强大又大大减少了家务所需的时间,是正儿八…

啤酒:畅享精酿啤酒与海鲜的鲜美滋味

夏日的阳光总是让人心生慵懒,而在这个季节里,没有什么比一杯冰镇啤酒和一串烤肉更能令人感到惬意了。当Fendi Club啤酒与烤肉相遇,它们将为你的夏日时光增添无尽的欢愉。 Fendi Club啤酒,以其醇厚的口感和酿造工艺收获了许多的啤酒…

専攻春节钜惠

専攻春节钜惠 大家好,新春佳节到来之际,为了答谢大家多年来的支持厚爱,也为了更广泛的推广VBA应用,“VBA语言専攻”在春节期间再次推出钜惠活动,时间2月9日到2月17日(大年三十到正月初八) 1 &…

宠物空气净化器哪个品牌质量好?实惠的猫用猫用净化器牌子测评

作为宠物主人,我们深知养宠物的乐趣和责任,但同时也面临着一些挑战,比如宠物脱毛、气味和室内空气质量等问题。正因如此,越来越多的家庭选择宠物空气净化器,为我们营造一个清新、健康的居住环境。 无论我们多么喜欢我…