Redis发布订阅及事务管理

目录

一、发布订阅

1.1、常用命令

1.2、示例演示

二、事务管理

2.1 Multi、Exec、Discard

2.2 示例演示

2.3 事务的错误处理

2.4 事务的冲突问题

2.4.1 事务场景

2.4.2 悲观锁

2.4.3 乐观锁

2.4.4 事务解决冲突—WATCH

2.4.5 UNWATCH

2.4.6 Redis事务的三个特性


一、发布订阅

        Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 ,以及订阅这个频道的三个客户端 —— client1 、client2 和 client3 之间的关系:

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

1.1、常用命令

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

1.2、示例演示

创建四个客户端Client1------Client 4 :

#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一次

二、事务管理

        Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis 事务的主要作用就是串联多个命令防止别的命令插队。

2.1 Multi、Exec、Discard

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

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

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

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

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

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

2.2 示例演示

#组队阶段成功、提交成功的情况
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"

2.3 事务的错误处理

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

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

2.4 事务的冲突问题

2.4.1 事务场景

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

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

2.4.2 悲观锁

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

2.4.3 乐观锁

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

2.4.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

2.4.5 UNWATCH

用于取消命令对所有key的监视,如果在执行watch命令之后,Exec或DisCard命令先被执行的话,那么就不需要再次执行unwatch。

2.4.6 Redis事务的三个特性

1、单独的隔离操作

事务中所有命令都会序列化,按顺序执行。事务在执行过程中,不会被其他客户端发来的请求锁打断。

2、没有隔离级别的概念

队列中的命令没有提交前都不会被实际执行,因为事务提交前,所有指令都是处于等待状态。

3、不保证原子性

事务中如果有一条命令执行失败,其后命令依旧会执行,并不会回滚。

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

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

相关文章

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

【GAMES101】Lecture 20 颜色

目录 光 颜色 加色系统 CIE RGB颜色匹配实验 颜色空间 CIE XYZ颜色空间 HSV颜色空间(Hue-Saturation-Value) CIELAB空间 减色系统:CMYK 光 光是由不同波长的光波组成的,其中可见光的波长范围在400nm到700nm 用谱功率密度(Spectral…

Low 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程(附链接)https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录,找到反射型 XSS 页面(笔者这里是 Low 级别) 先…

图像处理之《鲁棒图像隐写术:隐藏频率系数中的信息》论文精读

一、文章摘要 隐写术是一种将秘密信息隐藏到公共多媒体对象中而不会引起第三方怀疑的技术。然而,大多数现有的工作不能提供良好的抗有损JPEG压缩鲁棒性,同时保持相对较大的嵌入容量。提出了一种基于可逆神经网络的端到端鲁棒隐写系统。该方法将秘密信息…

医学搜题神器找答案? #知识分享#职场发展

大学生必备的搜题工具,专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索,每道题目都有详细的讲解,每个都堪称大学神器。 1.题小聪 这是一个公众号 它支持文本搜索、扫码搜书、拍照搜索,不会的题目直接对…

幻兽帕鲁PalWorld服务器2024年配置选择

幻兽帕鲁PalWorld是一款备受期待的虚拟游戏,其独特的幻兽系统和丰富的世界观吸引了大量玩家。然而,随着游戏日益受到关注,服务器的配置选择成为了关键问题。2024年,随着技术不断发展,玩家对于游戏体验的需求也在不断提…

[word] word自定义编号格式怎么设置 #经验分享#职场发展#职场发展

word自定义编号格式怎么设置 在Word文档的编辑中,经常会给段落添加编号,但是在编号的使用过程中我们会遇到很多问题,今天给大家分享word自定义编号格式怎么设置,希望能帮到您! 1.如何自定义编号格式? 点击…

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由 哈喽小伙伴们好,我是Stark-C~ 关注我的小伙伴都知道,我之前有分享过我的创作过程与工具,其中介绍了我个人其实一直都是使用Markdown的编辑器来进行图文创作的。 我…

如何在 Mac 上恢复永久删除的文件:有效方法

您是否错误地从 Mac 中删除了某个文件,并且确信它已经永远消失了?好吧,你可能错了。即使您认为已永久删除计算机上的数据,仍有可能将其恢复。 在本文中,您将了解如何在 Mac 上恢复永久删除的文件,并了解增…

基于微信小程序的校园失物招领小程序

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【Web】小白友好的Java内存马基础学习笔记

目录 简介 文件马与内存马的比较 文件马原理 内存马原理 内存马使用场景 内存马分类 内存马注入方式 这篇文章主要是概念性的,具体技术细节不做探究,重点在祛魅。 简介 内存马(Memory Shellcode)是一种恶意攻击技术&…

【后端高频面试题--Mybatis篇】

🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 后端高频面试题--Mybatis篇 什么是Mybatis?Mybatis的优缺点?Mybatis的特点…

大水仙花数求解

输入位数,求解水仙花数。暴力求解,位数如果太多,会超时。 思路: (1)11333355和33331155看上去是不一样的两个数,但是它们又一样,因为相同数字出现的次数一样。 (2&…

使用navicat导出mysql离线数据后,再导入doris的方案

一、背景 doris本身是支持直接从mysql中同步数据的,但有时候,客户不允许我们使用doris直连mysql,此时就需要客户配合将mysql中的数据手工导出成离线文件,我们再导入到doris中 二、环境 doris 1.2 三、方案 doris支持多种导入…

【C语言】一道相当有难度的指针题目(某大厂笔试真题)超详解

这是比较复杂的题目,但是如果我们能够理解清楚各个指针代表的含义,画出各级指针的关系图,这道题就迎刃而解了。 学会这道笔试题,相信你对指针的理解,对数组,字符串的理解都会上一个档次。 字符串存储使用的…

使用Arduino UNO和蓝牙模块制作智能小车

目录 概述 1 硬件结构 1.1 硬件组成 1.2 蓝牙模块介绍 1.3 控制板IO引脚定义 2 机械结构 3 固件设计 4 App设计 5 参考文献 概述 本文主要介绍使用Arduino UNO作为主板,用于控制电机和接收蓝牙模块数据。蓝牙模块用于从手机App上接收控制信号,使…

Windows下搭建Redis Sentinel

下载安装程序 下载Redis关于Windows安装程序,下载地址 下载成功后进行解压,解压如下: 配置redis和sentinel 首先复制三份redis.windows.conf,分别命名为:redis.6379.conf、redis.6380.conf、redis.6381.conf&…

Spring基础 - SpringMVC请求流程和案例

Spring基础 - SpringMVC请求流程和案例 什么是MVC 用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理…

【漏洞复现】SpringBlade export-user接口存在SQL注入漏洞

漏洞描述 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建,完全遵循阿里巴巴编码规范。提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。SpringBlade export-user接口存在SQL注…