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

 大家好~这里是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更加的强大

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

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

相关文章

18- 弹幕系统设计

1、弹幕系统设计 场景分析:客户端针对某一视频创建了弹幕,发送后端进行处理,后端需要对所有正在观看该视频的用户推送该弹幕。 1.1、实现方式 使用短连接进行通信或使用长连接进行通信。 1.1.1、短连接实现方案 所有观看视频的客户端不断…

设计模式之~命令模式

定义: 命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 为什么需要命令模式? 在我们的软件开发系统中…

长沙市直机关工委常务副书记梁敏一行莅临麒麟信安调研

5月25日,长沙市直机关工委专职副书记梁敏,市工信局党组成员、副局长、机关党委书记唐宁等一行莅临麒麟信安开展“党建引领数字经济发展工作”调研,麒麟信安党委书记王忠锋热情接待。 长沙市直机关工委专职副书记梁敏来到麒麟信安展厅&#…

SpringMVC第九阶段:Restful风格实现的CRUD

Restful风格实现的CRUD图书 把前面的传统请求方式的图书的CRUD换成刚刚讲的Restful风格的图书模块的CRUD。只需要修改页面端的请求方式和地址,以及服务器端Controller的接收。 1、列表功能实现 Controller中的修改: RequestMapping(value "/book",me…

数据表示(二进制、进制转换、补码计算)

目录 1.进制2.进制转换2.1 R进制转十进制2.2 十进制转R进制2.3 m进制转n进制方法1:十进制中转方法2:直接转化 3.进制计算3.1 机器数3.2 编码方式(原码、反码、补码、移码)3.3 表示范围定点整数定点小数 3.4 定点表示法 4.浮点数4.…

Python之网络编程

一、操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。 注&a…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划 1143.最长公共子序列解法一:动态规划 1035.不相交的线解法一:动态规划 53. 最大子序和 动态规划解法一:动态规划解法二&am…

机智云的离线语音识别模组,让家电变得更加智能和便捷

随着人们对智能化生活的需求不断增加,离线语音模组越来越受到欢迎。它可以为家庭、工作和娱乐提供更加智能和便捷的服务,例如通过语音指令控制家居设备、查询天气信息、播放音乐等。 “小智同学,打开灯光” “调到最亮” “正转一档” 人工智…

websocket在分布式场景的应用方案

websocket简介 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它可以在客户端和服务器之间建立持久连接,使得服务器可以主动向客户端推送数据,而不需要客户端不断地向服务器发送请求。 WebSocket 协议的优点包括: 实时性&#x…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一,前置知识准备 1,MVCC简介 MVCC 是多版本并发控制(Multiversion Concurrency Control)的缩写。它是一种数据库事务管理技术,用于解决并发访问数据库的问题。MVCC 通过创…

OpenMMLab-AI实战营第二期——2.人体关键点检测与MMPose

文章目录 1. 人体姿态估计的介绍和应用2-1. 2D姿态估计概述2.1 任务描述2.2 基于回归2.3 基于热力图2.3.1 从数据标注生成热力图(高斯函数)2.3.2 使用热力图训练模型2.3.3 从热力图还原关键点 2.4 自顶向下2.5 自底向上2.6 单阶段方法 2-2. 2D姿态估计详…

STM32单片机(三)第二节:GPIO输出练习(LED闪烁、LED流水灯、蜂鸣器)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

IIC总线协议的死锁问题

目录 1. IIC的特性 2. IIC死锁问题分析 3. 常见的IIC死锁问题解决方法 1. IIC的特性 IIC协议是一个允许一主多从通信的协议,只能用于短距离通信,并且只需要两根信号线来交换信息。 IIC的两根信号是SCL和SDA,SCL是时钟信号线,S…

javascript基础六:说说你对闭包的理解?闭包使用场景?

一、是什么 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure) 也就是说,闭包让你可以在一个…

CDN加速在网站建设中的应用

近年来,随着互联网技术的不断发展,互联网行业迎来了井喷式发展,各类网站如雨后春笋般不断涌现,网站数量迅速增长,但与此同时也导致网站响应速度慢、访问不流畅等问题。因此,如何优化网站的性能、提高网站的…

【算法】简单讲解如何使用两个栈实现一个队列

文章目录 什么是栈和队列?设计思路代码实现 什么是栈和队列? 栈和队列其实大家基本都知道是什么,或者说,最基本的,他们的特性我们是知道的。 栈是一种FILO先进后出的数据结构,队列是一种FIFO先进先出的数据…

IP-Guard客户端上插入加密盘时提示格式化,能否禁止该弹窗?

客户端上插入加密盘时提示格式化,能否禁止该弹窗? 1、当Shell Hardware Detection服务启动时,操作系统检测硬件的速度要快于客户端,而此时操作系统是不能识别加密后的移动盘的,因此认为加密盘异常,提示需要格式化,策略-客户端配置,选择禁止windows7播放功能。配置后不…

华为OD机试题【字符统计】【2023 B卷 100分】

文章目录 🎯 前言🎯 题目描述🎯 解题思路📙 Python代码实现📗 Java代码实现📘 C语言代码实现 🎯 前言 🏆 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

【快应用】多语言适配案例

【关键词】 多语言,$t 【问题背景】 快应用平台的能力会覆盖多个国家地区,平台支持多语言的能力后,可以让一个快应同时支持多个语言版本的切换,开发者无需开发多个不同语言的源码项目,避免给项目维护带来困难。使用系…

《Datawhale南瓜书》出第二版啦!

Datawhale干货 作者:Datawhale开源项目团队 作为机器学习的入门经典教材,周志华老师的《机器学习》,自2016年1月底出版以来,首印5000册一周售罄,并在8个月内重印9次。先后登上了亚马逊,京东,当…