【redis基础】事务|管道|发布订阅

news2024/10/7 6:42:50

 大家好~这里是redis系列文章之《【redis基础】事务|管道|发布订阅》上一篇文章:redis持久化【RDB+AOF】持久化双雄_努力努力再努力mlx的博客-CSDN博客


目录

事务

概念

作用

数据库事务vs redis事务

常用指令

情况1:正常执行

情况2:放弃事务

情况3:全体连坐

情况4:冤头债主

情况5:watch监控

总结

管道

面试题引出及问题由来

概念

案例演示

总结

发布订阅

概念

​编辑

常用命令

总结


事务

概念

所谓事务,即多条指令要么全部执行,要么全不执行,事务可以一次执行多个命令,本质上是一组命令的集合,一个事务的所有命令都会序列化,按顺序的串行化执行而不允许其他命令的插入,不允许加塞。

作用

将众多指令存放于一个队列中,一次性、按顺序、排他性的执行一系列指令

数据库事务vs redis事务

常用指令

事务的常用指令如下:

 我们对具体的指令进行详细介绍和使用:

情况1:正常执行

MULTI     // 事务开始
set ...
EXEC      // 执行

情况2:放弃事务

MULTI     // 事务开始
set ...
DISCARD   // 放弃事务

情况3:全体连坐

如果事务中的指令有一条存在语法错误,那么所有的指令全部不执行

MULTI     // 事务开始
set k1    // 语法编译不成功
EXEC      // 执行

情况4:冤头债主

在一组事务中,指令语法本身不存在错误,但是不符合指令语法的具体规范,再最后的exec时报错,此时只有报错的指令不执行,其他指令全部执行

MULTI     // 事务开始
incr k1   // 语法编译成功,但运行失败
EXEC      // 执行

情况5:watch监控

先明确几个概念:

 乐观锁: 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁策略:提交版本必须   大于   记录当前版本才能执行更新

悲观锁:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

CAS:与JUC的CAS类似

在redis中,watch来提供CAS的功能,其详细指令如下:

watch

正常情况:

  • 初始化 键值(k1 和 balance 两个key),先监控再开启multi,保证两key变动在同一事务内

  • watch k1 //加锁

    multi //开启事务

    set k1 ninini //第一次修改k1的value

    set k1 owowowo //第二次修改k1的value

由于是在一个事务内修改k1,k1即使加了watch锁,仍然操作成功

加塞情况:

watch 命令是一种乐观锁的实现,Redis 在修改的时候会检测数据是否被更改,如果更改了,则执行失败

unwatch

放弃监控

小结:

  • 一旦执行了 exec 之前加的watch监控锁都会被取消掉
  • 当客户端连接丢失的时候(比如退出连接),所有东西都会被取消监视

总结

开启
以 MULTI 开始一个事务
入队
将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
执行
由EXEC命令触发事务

管道

面试题引出及问题由来

问题由来

redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤:

1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。
2 服务端处理命令,并将结果返回给客户端。
上述两步称为:Round Trip Time(简称RTT,数据包往返于两端的时间),问题笔记最下方

 如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了,性能不太好,o(╥﹏╥)o

概念

管道(pipeline)可以一次性发送多条命令给服务端,服务端依次处理完完毕后,通过一条响应一次性将结果返回通过减少客户端与redis的通信次数来实现降低往返延时时间。pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。管道是为了解决RTT往返回时,仅仅将命令打包一次进行发送,对整个Redis执行不造成任何影响(一句话说,pipeline是对批处理的优化措施,类似Redis的原生批处理命令(mset /mget))

案例演示

总结

Pipeline 与原生批量

  1. 原生批量命令是原子性(如:mset,mget),pipeline是非原子性
  2. 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
  3. 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成

Pipeline 与事务对比

  1. 事务具有原子性,管道不具有原子性
  2. 管道一次性将多条命令发送到服务器,事务是一条一条发的,事务只有在接收到exec命令后才会执行,管道不会
  3. 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会

Pipeline 注意事项

  1. pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令
  2. 使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务器也被迫回复一个队列答复,占用很多内存

发布订阅

概念

  • 是一种消息通信模式:
    • 发送者(PUBLISH)发送消息
    • 订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递
  • Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流
  • 功能
    • Redis客户端可以订阅任意数量的频道,类似我们微信关注多个公众号

发布/订阅其实是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息

常用命令

SUBSCRIBE channel [channel]   // 订阅多个频道
PUBLISH channel message       // 对一个频道发布信息
PSUBSCRIBE pattern [pattern...]  // 按照模式批量订阅,订阅一个或多个符合给定模式(支持*号?号之类的)的频道
PUSUB CHANNELS                // 由活跃频道组成的列表
PUSUB NUMSUB channel [channel...]   // 某个频道有几个订阅者
PUBSUB NUMPAT   // 只统计使用PUBSCRIBE 命令执行的,返回客户端订阅的唯一模式的数量
UNSUBSCRIBE channel [channel...]    // 取消订阅
PUNSUBSCRIBE pattern [pattern...]   // 退订所有给定模式的频道

总结

优点

  • Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。(但不建议用,专业的事交给专业的工具MQ、kafka、RabbitMQ)

缺点

  • 发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃
  • 消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功。
  • 以上的缺点导致Redis的Pub/Sub模式就像个小玩具,在生产环境中几乎无用武之地,为此,Redis5.0版本新增了stream数据结构,不但支持多播,还支持数据持久化,相比Pub/Sub更加的强大

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

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

相关文章

微信小程序开发实践入门教程

随着微信小程序的火爆,越来越多的人开始关注微信小程序开发并加入开发大军中,而很多人对于如何开发微信小程序,并没有很好的思路和方法。因此,为了方便大家在学习、实践和应用的过程中能够少走弯路,本文将通过一篇关于…

IE11离线安装包ie离线升级ie11离线安装ie11补丁

首先下载ie11离线安装包与补丁文件: 下载地址(我的资源里有): (如不着急可私信直接要安装包补丁包,我若看到及时回复你) 1、 下载补丁文件和IE11安装程序(这里以32位系统为例&…

uni-app 金额格式化

普通过滤器(filter)在当前页面定义&#xff0c;复制红色代码即可 <template> <view> <text >{{balance|money}}</text> </view> </template> <script> export default{ data(){ return{ …

怎么让用户用好你的在线帮助文档协作工具?

在线帮助文档协作工具是现代企业中重要的工具&#xff0c;它可以帮助企业员工更好地协作&#xff0c;提高工作效率&#xff0c;减少沟通成本。然而&#xff0c;如何让用户用好在线帮助文档协作工具&#xff0c;满足其需求&#xff0c;本文将探讨以下几个方面&#xff1a; 一、…

LwIP 之七 详解 PBUF 结构、通信数据流、性能优化

数据包的复制在协议栈中是非常耗时的一个操作。LwIP 协议栈内部使用 pbuf 这种数据结构来对数据进行传递&#xff0c;灵活的 pbuf 结构体使得数据在不同网络层之间传递时可以减少内存的开销&#xff0c;避免频繁的内存复制&#xff0c;增加数据在不同层之间传递的速度。 简介 …

OJ练习第122题——交错字符串

交错字符串 力扣链接&#xff1a;97. 交错字符串 题目描述 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s …

Idea+maven+springboot项目搭建系列--1 整合Rocketmq

前言&#xff1a;本文以mavenspringboot 整合Rocketmq 完成消息的发送和接收。 1 Rocketmq 介绍&#xff1a; 1.1 Rocketmq 特性&#xff1a; Apache RocketMQ是一款快速、可靠的分布式消息传递和流处理平台&#xff0c;具有可扩展性和高性能。它是一个分布式的、去中心化的消…

docker 快速搭建elk

Docker搭建ELK步骤详解 文章目录 一.安装前须知二.安装 Docker三.Docker 安装 ElasticSearch四.Docker 安装 ElasticSearch-head&#xff08;可选&#xff09;五.Docker 安装 Kibana六.Docker 安装 LogStash七.创建springboot应用七.后记 一.安装前须知 以下步骤在 VMware 中…

清晰、明了的@Transcation事务嵌套使用

文章目录 概述Transcation注解事务实现原理 Transcation使用1、事务生效的情况&#xff1a;1. 外层有事务&#xff0c;内层无事务结论&#xff1a;外层有事务&#xff0c;内层也会有事务 2. 外层事务&#xff08;requierd&#xff09;&#xff0c;内层事务&#xff08;not_supp…

HEVC环路后处理核心介绍

介绍 为什么需要环路后处理技术 hevc采用基于快的混合编码框架&#xff0c;方块效应、振铃效应、颜色偏差、图像模糊等失真效应依旧存在&#xff0c;为了降低此类失真影响&#xff0c;需要进行环路滤波技术&#xff1b; 采用的技术 去方块滤波DF&#xff0c;为了降低块效应…

ADC和DAC的工作原理及其区别

ADC和DAC的工作原理及其区别 ADC和DAC都是用于模拟信号与数字信号之间的转换器。 ADC&#xff0c;即模数转换器&#xff0c;是将连续的模拟信号转换为数字信号的电路。其输入为模拟信号&#xff0c;输出为数字信号。ADC的主要组成部分是模拟信号采样模块、模拟信号处理模块、模…

生态系统服务(InVEST模型)土壤保持、水源涵养、氮磷输出、生态保护、生物多样性、碳固

白老师&#xff08;研究员&#xff09;&#xff1a;长期从事生态系统结构-格局-过程-功能-服务的变化与响应关系等研究工作&#xff1b;重点围绕生物多样性、生态系统服务与价值等&#xff0c;构建生物地球化学模型和评价指标体系&#xff0c;为城市、区域和自然保护区的可持续…

sqlserver中动态sql语句应用

前言 一、使用exec 1.用拼接方法 二、使用sp_executesql 1.用拼接方法 2.传参的方法 总结 前言 例如&#xff1a;列表查询条件不固定&#xff0c;根据前端传过来的参数&#xff0c;这时需要根据查询条件后台动态生成SQL语句 一、使用exec exec适用于字符串拼接的方式&#xf…

mac安装python

接上集&#xff0c;我们已经安装了Homebrew 那么在 macOS 上安装 Python 有多种方法&#xff0c;以下是其中两种常用方法&#xff1a; 1&#xff1a;使用 Homebrew 安装 Python Homebrew 是 macOS 上的包管理器&#xff0c;可以方便地安装和管理各种软件包。如果您已经安装了…

美国E8267C是德(KEYSIGHT) E8267D 20G/44G矢量信号发生器

Agilent E8267C、Keysight E8267D、 PSG 矢量信号发生器&#xff0c;高达 44 GHz ​Keysight E8267D (Agilent) PSG 矢量信号发生器是业界首款 I/Q 调制高达 44 GHz 的集成微波矢量信号发生器。它具有先进的宽带内部基带发生器&#xff0c;能够灵活地播放任意波形或生成复杂的…

在Windows11上模拟运行Linux命令的几种方式

在 Windows 上运行 Linux 命令的软件有很多&#xff0c;以下是其中几个比较常用的&#xff1a; Cygwin Cygwin 是一个为 Windows 提供类 Unix 环境的开源软件&#xff0c;它包含了大量的 Unix 工具和命令&#xff0c;可以在 Windows 上运行 Linux 命令。 安装命令 winget i…

【Java 继承】了解Java类的继承的特点,继承的关系,继承的使用,到底什么是继承?

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从入门到入坟 Java 继承 继承的特点 \ 介绍 ❓特点 ♊ 继承的使用方式 &#x1f51e;避免重复方法 子类访问父类的成员变量 &#x1f232;子类访问父类的成员变量&#xff08;直接访问&#xff09;访问父类与子类…

MapReduce实战案例(3)

案例三: MR实战之TOPN(自定义GroupingComparator) 项目准备 需求测试数据 有如下订单数据 订单id商品id成交金额Order_0000001Pdt_01222.8Order_0000001Pdt_0525.8Order_0000002Pdt_03522.8Order_0000002Pdt_04122.4Order_0000002Pdt_05722.4Order_0000003Pdt_01222.8 现在…

6 具有 OCR 功能的顶级 PDF 图像转 Word 转换器

如果您在 PDF 图像中找到一些有用的信息并想转换为 Word 格式以供进一步使用&#xff0c;您将需要一个具有OCR 功能的 PDF 图像转 Word 转换器&#xff0c;该转换器旨在识别 PDF 图像中的文本并将其制作出来可编辑。 将 PDF 图像转换为 Word 并不容易&#xff0c;因为我们需要…

高压放大器工作原理(高压放大器怎么用的)

高压放大器是一种能够将低电平信号放大到足够高的电平&#xff0c;以便用于驱动大功率负载或处理高电压信号的电子设备。它广泛应用于各种电子设备中&#xff0c;例如音频放大器、射频放大器、电力电子设备等。下面我们将详细介绍高压放大器的工作原理以及使用方法。 高压放大器…