Redis 7 第五讲 事务、管道、发布订阅 过渡篇

 事务

理论

         可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

        一个队列中,一次性、顺序性、排他性的执行一系列命令

Redis事务 VS 关系型数据库事务 

单独的隔离操作Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的
没有隔离级别的概念事务提交前任何指令不会被执行,因此不存在脏读、幻读等
不保证原子性Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
排它性Redis会保证一个事务内的命令依次执行,而不会被其它命令插入

命令

DISCARD取消事务,放弃执行事务块内的所有命令。
DISCARD取消事务,放弃执行事务块内的所有命令。
EXEC标记一个事务块的开始。
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH  监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

案例

 正常放行

         (MULTI->指令集->EXEC)

 放弃事务

        (MULTI->指令集->DISCARD) 

全部连坐

        一个队列中,命令在写入队列时出现错误,将直接影响队列整体的提交。

冤头债主

        一个队列中,命令在写入队列时未出现错误,但在执行时出错。只影响错误指令的执行结果,其他正常执行的指令结果没影响。

WATCH监控 

        Redis 使用watch提供乐观锁锁定,类似CAS(CHECK-AND-SET)

悲观锁(Pessimistic Lock)每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,想拿这个数据就会block直到它拿到锁。
乐观锁(Optimistic Lock)每次去拿数据的时候都认为别人不会修改,所以不会上锁,在更新 的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁策略:提交版本必须 大于 记录当前版本才能执行更新
CAS利用WATCH去监控key,EXEC时去验证是否被操作

        初始化acount和balance两个key,先监控再开启multi保证两key变动在同一个事务内

未加塞 

加塞 

如果监控的balance事务开启后,被其他客户端修改后,当前客户端的事务失败。

 UNWATCH

管道 

 面试题

        如何优化频繁命令往来造成的性能瓶颈?

        管道(pipeline)可以一次性发送多条命令给服务端,服务端依次处理完完毕,通过一次性将响应结果返回,减少客户端与redis的通信次数来实现降低往返延时时间。

        pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。 

作用

         Pipeline是为了解决RTT往返回时,仅仅是将命令打包一次性发送,对整个Redis的执行不造成其它任何影响。简言之,批处理命令变种优化,类似Redis的原生批处理命令(mget/mset)

 案例 

         利用Linux的CAT命令特性,返回结果集作为pipe的参数

 总结

管道与原生批量命令对比原生批量命令是服务端实现的,管道需要服务的与客户端共同完成
原生批量命令一次只能执行一种命令,管道支持批量执行不同命令
原生命令是原子性(如mset\mget),管道是非原子性的
管道与事务对比事务具有原子性,管道不具有原子性
事务逐条发送到队列,接收到exec命令后才执行;管道一次性将多条命令发送到服务器
执行事务时会阻塞其他命令执行;管道中的命令不会阻塞
使用管道注意事项管道缓冲的指令只会依次执行,不保证原子性,执行过程中发生异常,会继续执行后续指令
使用管道组装的命令个数不能太多,数据量过大客户端阻塞的时间可能过久,服务端也被迫回复一个队列答复,占用很多内存

发布订阅 (了解)

理论

        一种消息通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递 。

        Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。

        代表我个人,不推荐使用该功能,专业的事情交给专业的中间件处理,redis就做好分布式缓存功能

案例 

        先订阅再发布 

SUBSCRIBE pattern [pattern ...]订阅一个或多个符答给定模式的频道。

PUBSUB subcommand [argument [argument ...]查看订阅与发布系统状态。 

PUBLISH channel message将信息发送到指定的频道。 

PUNSUBSCRIBE[pattern[pattern ..]退订所有给定模式的频道。 

SUBSCRIBE channel [channel ...]订阅给定的一个或多个频道的信息。 

UNSUBSCRIBE [channel [channel ...]指退订给定的频道。 

 缺点

         发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布

        消息只管发送对于发布者而言消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功 

        Redis5.0版本新增了Stream数据结构,不但肢持多播,还支持数据持久化,相比Pub/Sub更加的强大 

🌹 以上分享 Redis 事务、管道、发布订阅,如有问题请指教写。

🌹🌹 如你对技术也感兴趣,欢迎交流。

🌹🌹🌹  如有需要,请👍点赞💖收藏🐱‍🏍分享 

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

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

相关文章

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出

需求 在资金明细的页面中&#xff0c;点击按钮时筛选区域从左侧滑出&#xff0c;完成筛选点击确认后调用接口完成数据查询&#xff0c;筛选区域滑入左侧&#xff1b; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…

艾昆纬携手亚马逊云科技赋能生物医药企业,加速武田数字化转型

IQVIA艾昆纬是全球以及中国医疗健康服务领域的领导者&#xff0c;利用其数据及分析&#xff0c;前沿数字化技术和医疗领域的专业知识&#xff0c;智能连接医疗生态的各个环节。过去几年&#xff0c;IQVIA艾昆纬所服务的生物医药行业客户武田中国也迎来了数字化转型的高潮。 武田…

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案

一、研发背景 随着经济的发展和人们生活水平的提高&#xff0c;越来越多的人喜欢在周末去周边的森林公园旅游&#xff0c;享受大自然的美景&#xff0c;并进行野炊和烧烤等娱乐活动。然而&#xff0c;近年来由于烟蒂和烧烤碳渣等人为因素&#xff0c;森林公园火灾频繁发生。森…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,动态数组(重点推荐))七(129)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 说明&#xff1a; 1.X轴为地域&#xff0c;Y轴为地域出现的次数&#xff1b; 2. 动态展示&#xff08;有地域展示&#xff0c;没有不展示&#xff0c;且高低排序&#xff09; Demo案例&#xff1a; …

Ansible学习笔记11

Command和Shell模块&#xff1a; 两个模块都是用于执行Linux命令的&#xff0c;这个对于命令熟悉的工程师来说&#xff0c;用起来非常high。 Shell模块跟Command模块差不多&#xff08;Command模块不能执行一类$HOME、> 、<、| 等符号&#xff0c;但是Shell是可以的。&…

【Mycat 2】详解分库分表设计方案及实操测试(二)

文章目录 4. 分表、不分实例、不分库4.1 数据分片映射关系4.2 测试过程5. 分实例、分表、不分库5.1 分库键和分表键相同5.1.1 数据分片映射关系5.1.2 测试过程5.2 分库键和分表键不相同5.2.1 数据分片映射关系5.2.2 测试过程6. 不分片6.1 普通表6.1.1 数据映射关系6.1.2 测试过…

本地部署 CodeLlama 并在 VSCode 中使用 CodeLlama

本地部署 CodeLlama 并在 VSCode 中使用 CodeLlama 1. CodeLlama 是什么2. CodeLlama Github 地址3. 下载 CodeLlama 模型4. 部署 CodeLlama5. 在 VSCode 中使用 CodeLlama6. 使用WSGI启动服务7. 创建 start.sh 启动脚本 1. CodeLlama 是什么 Code Llama 是一个基于 Llama 2 的…

Navicat 强大的数据模型功能 | 面向数据库设计、架构和数据资产梳理等使用场景

数据模型是用来描述数据、组织数据和对数据进行操作的一组概念和定义。根据不同的应用需求&#xff0c;数据模型可以分为概念模型、逻辑模型和物理模型。这些数据模型帮助数据库设计人员设计和管理数据库&#xff0c;以满足用户的需求。 Navicat 强大的数据模型功能主要适用于…

Linux内核源码分析 (A)常见内核面试题

Linux内核源码分析 (A)常见内核面试题 文章目录 Linux内核源码分析 (A)常见内核面试题调用 schedule() 进行进程切换的方式有几种CFS调度器vruntime的计算方式 网站收集面试题集合1 调用 schedule() 进行进程切换的方式有几种 系统调用 do_fork()&#xff1a;copy_process()定…

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

LabVIEW液压支架控制系统的使用与各种配置的预测模型的比较分析

LabVIEW液压支架控制系统的使用与各种配置的预测模型的比较分析 模型预测控制在工业中应用广泛。这种方法的优点之一是在求解最优控制问题时能够明确考虑对输入和输出状态施加的约束。控制对象模型用于有限时间范围内最优控制的实时计算。所使用的数学设备允许从具有单输入和单…

WordPress(3)会员插件安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、服务器中上传插件二、使用步骤1.启动插件前言 提示:会员插件的安装不能在网站后台插件中心中直接安装原因我还没有排查 原因:会导致网站停止运行 一、服务器中上传插件 二、使用步骤 …