当前位置: 首页 > news >正文

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

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

相关文章:

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 事务解决冲…...

设计模式第五天|代理模式 7-小明买房子 装饰模式 8-咖啡加糖

目录 【设计模式专题之代理模式】7-小明买房子【设计模式专题装饰模式】8-咖啡加糖 【设计模式专题之代理模式】7-小明买房子 文章链接:卡码网设计模式 题目链接:7-小明买房子 这里注意在HomeAgent类里需要定义对象成员变量HomeBuyer,这里在实…...

mongodb数据库集合(表)的创建和数据修改

文章目录 前言发现宝藏一、集合的创建二、集合的修改三、数据插入数据库四、清空数据库集合数据 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作…...

MySQL 的UI

MySQL也有许多用户界面(UI)工具,用于管理数据库。以下是一些流行的MySQL UI工具: 1. **MySQL Workbench:** 由MySQL官方提供,功能强大,支持数据库建模、SQL开发、服务器配置等。 2. **DBeaver&a…...

Leetcode 3026. Maximum Good Subarray Sum

Leetcode 3026. Maximum Good Subarray Sum 1. 解题思路2. 代码实现 题目链接:3026. Maximum Good Subarray Sum 1. 解题思路 这一题的话主要就是要快速遍历所有的good subarray并快速获得每一个good subarray的和的最大值。 因此,问题就主要就成了两…...

elementUI之el-form-item的嵌套的场景

像这种,计费规则这几个字而且带红点,外观上是el-form-item,但是其并没有直接和控件进行相关联,这是和其他的el-form-item不同之处。所以这里就得用上嵌套了。也就是说elementUI中el-form-item是可以嵌套使用的。...

Linux项目自动化构建工具之make/Makefile演示gcc编译

文章目录 一、背景二、如何使用?三、原理四、关于make的问题五、再次理解/编写makefile依赖关系依赖方法 六、原理讲解项目清理makefile是支持变量的取消执行make后显示命令依赖方法可以多行 一、背景 会不会写makefile,从一个侧面说明了一个人是否具备…...

ChatGPT 官方中文页面上线

根据页面显示,OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试,允许用户选择不同语言的界面进行交互。 如下图所示,ChatGPT 会检测系统当前所使用的语言,并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…...

算法学习——华为机考题库10(HJ64 - HJ69)

算法学习——华为机考题库10(HJ64 - HJ69) HJ64 MP3光标位置 描述 MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲&a…...

[office] Excel中去除表格小数点后面数字的操作方法 #知识分享#学习方法

Excel中去除表格小数点后面数字的操作方法 如何去除EXCEL表格中小数点后面的数字,双击表格时只留有整数,今天,小编就教大家在Excel中去除表格小数点后面数字的操作方法。 Excel中去除表格小数点后面数字的操作步骤如下: 如图&…...

2023年度报告

欲买桂花同载酒,终不似,少年游! 思来想去,虽然迟到一月,还是觉得要写上一篇年度总结报告回忆过去的一年(准确来说是半年,毕竟前年的年终总结报告是在去年的5月末写的), …...

基于springboot智慧养老平台源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…...

IDEA插件ChatGPT - Easycode安装使用

IDEA插件ChatGPT - Easycode简介 ChatGPT - Easycode 是一个由 OpenAI 开发的 IntelliJ IDEA 插件,它可以利用 ChatGPT 的强大语言生成能力,帮助开发人员提高编码效率。 主要功能: 代码生成:可以根据自然语言描述生成代码&…...

设置 相关

记录使用过程中做的设置相关事宜。方便后续查询 vscode如何自动生成html格式: vscode快速生成html模板 --两种方法,亲测有用_vscode自动生成html模板-CSDN博客 使用第二个方式。存储html格式后缀。输入!,vscode自动补全。 安装…...

argcomplete,一个超酷 Python 库!

前言 大家好,今天为大家分享一个超酷的 Python 库 - argcomplete。 Github地址:https://github.com/kislyuk/argcomplete 命令行工具是开发者和系统管理员的得力助手,但随着命令行选项的增多,用户可能会感到困惑。Python 中的 a…...

<设计模式>单例模式懒汉和饿汉

目录 一、单例模式概述 二、懒汉模式和饿汉模式 1.饿汉模式 1.1代码实现 1.2实现细节 1.3模式优劣 2.懒汉模式 2.1代码实现 2.2实现细节 2.3模式优劣 三、多线程下的线程安全问题 1.懒汉和饿汉线程安全问题分析 1.1安全的饿汉模式 1.2不安全的懒汉模式 2.懒汉线程…...

二分查找------蓝桥杯

题目描述&#xff1a; 请实现无重复数字的升序数组的二分查找 给定一个元素升序的、无重复数字的整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的target&#xff0c;如果目标值存在返回下标 (下标从0 开始)&#xff0c;否则返回-1 数据范围: 0 < l…...

今日arXiv最热NLP大模型论文:微软提出SliceGPT,删除25%模型参数,性能几乎无损

引言&#xff1a;探索大型语言模型的高效压缩方法 随着大型语言模型&#xff08;LLMs&#xff09;在自然语言处理领域的广泛应用&#xff0c;它们对计算和内存资源的巨大需求成为了一个不容忽视的问题。为了缓解这些资源限制&#xff0c;研究者们提出了多种模型压缩方法&#…...

ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI

文章目录 ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI一、ChatGPT(OpenAI)的新版API调用1.1 环境变量配置与调用1.2 新版api调用1.3 命令行流式输出二、Gradio制作自己的聊天WebUI2.1 流式WebUI2.2 样式调整三、总结参考ChatGPT实战100例 - (13) 写一个属于自…...

【计算机学院寒假社会实践】——服务走进社区,共绘幸福蓝图

为深入贯彻落实志愿者服务精神&#xff0c;扎实推进志愿者服务质量&#xff0c;2024年1月28日&#xff0c;曲阜师范大学计算机学院“青年扎根基层&#xff0c;服务走进社区”社会实践队队员周兴睿在孙宇老师的指导下&#xff0c;来到山东省滨州市陈集街道社区开展了为期一天的“…...

LeaguePrank终极指南:免费打造个性化英雄联盟界面体验

LeaguePrank终极指南&#xff1a;免费打造个性化英雄联盟界面体验 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为英雄联盟千篇一律的客户端界面感到乏味吗&#xff1f;LeaguePrank这款免费开源工具让你轻松自定义游戏中…...

千问3.5-9B模型切换指南:OpenClaw多模型动态调用

千问3.5-9B模型切换指南&#xff1a;OpenClaw多模型动态调用 1. 为什么需要多模型动态调用 上周我尝试用OpenClaw自动整理电脑里积压的300多份PDF文档时&#xff0c;遇到了一个有趣的现象&#xff1a;处理简单文件重命名任务时&#xff0c;轻量级模型响应飞快&#xff1b;但遇…...

Vector API + Panama Foreign Function最新融合实践(2024 Q2实测):纯Java实现BLAS级矩阵运算

第一章&#xff1a;Vector API Panama Foreign Function融合背景与技术演进Java 平台长期面临两大性能瓶颈&#xff1a;一是 JVM 对现代 CPU 向量化指令&#xff08;如 AVX-512、SVE&#xff09;缺乏直接、安全、可移植的抽象&#xff1b;二是 Java 与本地系统库&#xff08;如…...

Java虚拟线程调试黄金组合:jstack -l + jcmd VM.native_memory + JMC Thread Group视图(生产环境零侵入诊断法)

第一章&#xff1a;Java虚拟线程调试黄金组合&#xff1a;jstack -l jcmd VM.native_memory JMC Thread Group视图&#xff08;生产环境零侵入诊断法&#xff09;虚拟线程&#xff08;Virtual Threads&#xff09;作为 Project Loom 的核心特性&#xff0c;在高并发场景下显著…...

【JupyterLab实战】构建跨平台AI算力监控仪表盘

1. 为什么需要跨平台AI算力监控&#xff1f; 在AI开发过程中&#xff0c;我们经常遇到这样的场景&#xff1a;模型训练到一半突然卡死&#xff0c;却不知道是GPU内存爆了还是CPU瓶颈&#xff1b;多卡并行时某张卡莫名其妙跑不满&#xff1b;昇腾芯片的温度报警频繁触发却找不到…...

湖南石材结晶公司

在长沙&#xff0c;无论是高端商场、星级酒店&#xff0c;还是政务大厅、三甲医院&#xff0c;光洁如镜、平整如砥的石材地面&#xff0c;都是其专业形象与高端质感的直接体现。然而&#xff0c;石材作为“面子工程”&#xff0c;长期承受高频人流、设备碾压&#xff0c;极易出…...

美的集团2025年营收创新高、利润100%分红 落地1.3万个AI智能体

3月30日&#xff0c;美的集团发布2025年年报&#xff0c;实现营业总收入4585亿元&#xff0c;同比增长12.1%&#xff1b;归属于上市公司股东的净利润439.5亿元&#xff0c;同比上升14%。在业绩再创新高的同时&#xff0c;伴随我国“人工智能”行动的全面实施&#xff0c;美的集…...

AI报告文档审核助力生态数据可信化:IACheck提升生物多样性调查报告物种识别准确性

在生态环境保护逐渐走向精细化管理的背景下&#xff0c;生物多样性调查数据的重要性不断提升。从自然保护区评估到生态修复项目&#xff0c;从环境影响评价到长期生态监测&#xff0c;物种数据已成为支撑决策的重要基础。而在这些数据中&#xff0c;“物种识别的准确性”&#…...

大模型RL算法梳理:从全量词元到部分词元的路径演化

一、 引言&#xff1a;大模型强化学习算法的演化格局 近年来&#xff0c;以 OpenAI 的 o1 系列、DeepSeek 的 R1&#xff0c;以及 Qwen 系列模型为代表&#xff0c;大语言模型在数学证明、代码生成等长链路推理任务中展现出更强的稳定性与推理深度。 在这一背景下&#xff0c;面…...

掌握5个核心配置技巧:OpenCore-Configurator从入门到专家

掌握5个核心配置技巧&#xff1a;OpenCore-Configurator从入门到专家 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator OpenCore-Configurator&#xff08;简称…...