Redis事务、pub/sub、PipeLine-管道、benchmark性能测试详解

news2025/1/23 4:45:56

一. 事务

1. 概念补充

(1). 原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

2. redis事务说明

 Redis的事务并不是我们传统意义上理解的事务,我们都知道 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

总结:

 (1). Redis事务中如果有某一条命令执行失败,之前的命令不会回滚,其后的命令仍然会被继续执行→ →鉴于这个原因,所以说redis的事务严格意义上来说是不具备原子性的。

 (2). Redis事务中所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

 (3). 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。

 (4). 当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis-check-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。

3. 流程/指令

(1)multi 开启事务

(2)大量指令入队

(3)exec执行事务块内命令,截止此处一个事务已经结束。

(4)discard 取消事务

(5)watch 监视一个或多个key,如果事务执行前key被改动,事务将打断。unwatch 取消监视。

4. 测试

(1). 正常事务执行

(2). 取消事务

5. Redis为什么不支持事务回滚?(官方解释)

这种做法的优点:

(1). Redis 命令只会因为错误的语法而失败,或是命令用在了错误类型的键上面,这些问题不能在入队时发现,这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中.

 (2). 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

 有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。鉴于没有任何机制能避免程序员自己造成的错误, 并且这类错误通常不会在生产环境中出现, 所以 Redis 选择了更简单、更快速的无回滚方式来处理事务。

补充一种情况:错误指令在入队的时候,redis是能检测出来的,当exec的时候,全部命令都不会执行。但是开发层次的错误如同上面所说 incr 1,但是不小 incr 2, redis无法判断。

更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

二. 发布订阅(pub/sub)

1. 简介

 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息,Redis 客户端可以订阅任意数量的频道。

 Redis 本身的 发布订阅 (pub/sub) 来实现消息队列的功能,有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。Redis Stream这个新的数据结构 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。但还是建议使用专业的消息队列,如:RabbitMq 、RocketMq等等。

2. 指令说明

(1). subscribe:订阅给定的一个或多个频道的信息(频道不存在的时候会创建频道),返回接收到的信息。

SUBSCRIBE channel [channel2 ....]

(2). publish:将信息 message 发送到指定的频道 channel,接收到信息 message 的订阅者数量。

publish channel message

(3). unsubscribe:指示客户端退订给定的频道。

unsubscribe [channel [channel ...]]

(4). psubscribe:订阅一个或多个符合给定模式的频道。

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、news.global.today 等等),诸如此类。

psubscribe pattern [pattern ...]

(5). punsubscribe:指示客户端退订所有给定模式。

punsubscribe [pattern [pattern ...]]

3. 实操

(1). 开启客户端A和客户端B,对频道 chanel1 和 chanel2同时进行订阅。

subscribe chanel1 chanel2

(2). 开启一个客户端C,向chanel1频道进行发送信息 。

(3). 查看接收到的消息。

三. PipeLine-管道

1. redis常规请求模型

 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

(1). 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

(2). 服务端处理命令,并将结果返回给客户端。

2. 管道模型

 Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

 客户端可以一次性发送多个请求而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应,这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。需要注意到是用pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行

jedis代码:

Pipeline pl = jedis.pipelined();
 for (int i = 0; i < 10; i++) {
  pl.incr("pipelineKey");
  pl.set("zhuge" + i, "zhuge");
 }
 List<Object> results = pl.syncAndReturnAll();
 System.out.println(results);

四. benchmark性能测试

1. 说明

 benchmark是位于redis安装目录下的一个性能测试工具,可以同时执行n个请求来检测redis的性能。

常用指令:

#1. 用10000个请求检测本机redis的各种指令的性能 ./redis-benchmark -n 10000 -q #2. 测试指定地址指定请求的redis性能(测试set和get性能) ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -n 10000 -q

参数说明:

2. 测试在win10下的redis3.2的性能

 电脑配置:4核16G

 redis默认配置情况下用10000个请求进行测试,测试结果如下图:

3. 测试centos8下redis5.0的性能

 电脑配置:2核8G

 redis默认配置情况下用10000个请求进行测试,测试结果如下图:

4.测试centos8下redis6.0的性能

 电脑配置:2核8G,默认多线程是关闭的,需要手动开启:

 redis默认配置情况下用10000个请求进行测试,测试结果如下图:

原文链接:第八节: Redis事务、pub/sub、PipeLine-管道、benchmark性能测试详解

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

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

相关文章

SpringCloud Alibaba学习笔记,记重点!!

SpringCloud Alibaba入门简介 Spring Cloud Netflix 项目进入维护模式&#xff0c;Spring Cloud Netflix 将不再开发新的组件。Spring Cloud 版本迭代算是比较快的&#xff0c;因而出现了很多重大 ISSUE 都还来不及 Fix 就又推另一个 Release 了。进入维护模式意思就是目前一直…

深入了解- TCP拥塞状态机 tcp_fastretrans_alert

【推荐阅读】 浅析linux内核网络协议栈--linux bridge virtio-net 实现机制【一】&#xff08;图文并茂&#xff09; 深入理解SR-IOV和IO虚拟化 这里主要说的是TCP拥塞情况下的状态状态处理 /* Process an event, which can update packets-in-flight not trivially.* Main go…

投资者该如何看待股票接口?

大部分做量化的投资者都会使用股票接口或者量化平台来协助交易&#xff0c;我们应该怎样去看待这些工具呢&#xff1f; 首先&#xff0c;如果我们要做量化&#xff0c;肯定是需要一个靠谱的股票接口去协助自己的&#xff0c;不然只靠人工是无法达到程序化交易的目的的&#xff…

使用gitlab的cicd自动化部署vue项目shell流程踩坑之路

强烈建议&#xff1a;先在部署的服务器上手动跑一边流程 包括&#xff1a;&#xff08;服务器上要安装node、npm、git等依赖&#xff09; 1. git clone 仓库地址 2. npm install / yarn 安装依赖 3. cp -rf dist/ /var/www/html 如果以上步骤都没有出错&#xff0c;那再安…

自从面试了一个测试岗00后卷王,老油条感叹真干不过,但是...

周末和技术大佬们聚餐&#xff0c;聊到了测试行业的“金九银十”高峰就业问题&#xff0c;普遍认为转行和大学生入行的越来越多&#xff0c;内卷之势已然形成。 现在不论面试哪个级别的测试工程师&#xff0c;面试官都会问一句 “会编程吗&#xff1f;有没有自动化测试的经验&…

当线下门店遇上AI:华为云ModelBox携手佳华科技客流分析实践

摘要&#xff1a;在赋能传统门店客流经营数字化转型方面&#xff0c;华为云ModelBox与伙伴佳华科技合作推出的“华为云客流统计项目”&#xff0c;算是一次成功的探索。本文分享自华为云社区《当线下门店遇上AI—华为云ModelBox携手佳华科技客流分析实践》&#xff0c;作者&…

linux安装mysql8超详细到每步命令

1、到指定目录去下载安装包 cd /usr/local/src 2、下载mysql8 版本可以自己选择 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 3、解压mysql8, 通过xz命令解压出tar包(需要发时间解压可能会久&#xff0c;根据服务器性…

如何理解死锁?

目录 今日良言:等风来,不如追风去 一、死锁 1.概念 2.死锁的三个典型情况 3.死锁的必要条件 4.如何破除死锁 &#x1f433;今日良言:等风来,不如追风去 &#x1f415;一、死锁 &#x1f407;1.概念 多个线程在争夺资源时,陷入了僵持状态,都无法进行下去,都在等待对方释…

一种非线性权重的自适应鲸鱼优化算法IMWOA附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

uni-app简介、条件编译、App端Nvue开发、HTML5+、开发环境搭建、自定义组件、配置平台环境、uniCloud云开发平台

uni-app简介 &#xff1a; 概述&#xff1a;uni-app是一个前端跨平台框架&#xff1a;会uni-app就可以用一套代码&#xff08;类似vue语法&#xff09;打包出安卓、ios、及各种小程序&#xff08;微信、qq、支付宝等&#xff09;端跨平台发布。 生态&#xff1a;完整的生态&a…

Spring6 正式发布!重磅更新,是否可以拯救 Java

简介 Spring Framework6 和 Spring Boot3 是一个跨越式的升级整个框架支持的最低 JDK 版本直接跨越到 JDK17&#xff0c;无论框架层还是基础设施层都做了巨大的改变&#xff0c;Spring 6.0 新框架具体做了哪些功能的升级与改进&#xff0c;是否有必要升级与使用呢&#xff1f;…

html网页制作期末大作业成品:基于HTML+CSS+JavaScript简洁汽车网站(7页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

「Redis」07 持久化操作(RDB、AOF)

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——持久化操作&#xff08;RDB、AOF&#xff09; 1. RDB&#xff08;Redis DataBase&#xff09; 概述 RDB是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 即 Snapshot 快照&#xff0c;恢…

实战 Creator 2.x 项目升级 3.x!避坑要点与基础 API 写法差异总结

最近&#xff0c;我将自己在 Cocos Store 上的一个 2D 项目《球球要回家》从 Creator 2.2.2 升级到 Creator 3.6.2&#xff0c;编程语言也从 JavaScript 全面升级至 TypeScript 并适配微信小游戏&#xff0c;目前在微信审核中&#xff01;本篇文章就来跟大家分享一下&#xff0…

发布3天获推荐10w+,视频号内容出现新玩法?

上月&#xff0c;腾讯发布Q3季度财报&#xff0c;视频号也被重点提及&#xff0c;广告主对其早前上线的原生信息流广告需求强劲&#xff0c;像首批投放的阿玛尼等品牌的广告还曾引起过不少讨论。用户对视频号广告的关注热度高&#xff0c;也从侧面说明&#xff0c;视频号目前的…

大数据流批一体

流批一体的内涵 流批一体中的“流批”是指流处理与批处理&#xff0c;是两种不同的数据处理方式&#xff0c;而不是对数据种类的划分。具体来说&#xff0c;数据可以按产生的时间划分为历史数据与实时数据&#xff0c;亦可按数据的明细程度分为流水数据与切片数据&#xff1b;数…

VS2022环境下C++ DLL动态链接库的编写和调用

一、编写DLL动态链接库 1、新建动态链接库项目 2、新建类 3、宏定义 #ifdef DLL_API # define DLL_API _declspec(dllexport) # else # define DLL_API _declspec(dllimport) #endif 4、使用宏定义修饰类 /*h*/ #pragma once#ifdef DLL_API # define DLL_API _declspec(dl…

ad2019--LED灯按键类创建元件库

摘自凡亿教育 一、LED灯按键类创建元件库 1.绘制LED灯的原理图库 鼠标右击箭头所指的&#xff0c;然后选择倒数第三个&#xff0c;多边形 在画的时候可以按住&#xff0c;shift空格&#xff0c;来调整角度。 但是&#xff0c;一般的LED灯都是蓝色的&#xff0c;我们可以把它…

用MybatisPlus代码生成器生成代码

作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性&#xff0c;喜欢跟广大ADC一起打野升级&#xff0c;欢迎您关注&…

用帝国主义竞争算法(ICA)求解旅行商问题(TSP)(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…