StackExchange.Redis官方文档(三)【管道和多路复用器】

使用 StackExchange.Redis 在 C# 中开始使用 Redis Redis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis 支持多种类型的数据结构,如字符串(strings)、哈希表(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与位图(bitmaps)、超日志(hyperloglogs)和地理空间(geospatial)索引半径查询等。 阅读详情

管道和多路复用器

延迟情况是难以忍受的。现代计算机能以惊人的速度生成数据,并且高速互联网(经常是在重要的服务器之间有多个并行连接)提供了极大的带宽,但是这可恶的延迟意味着电脑花了大量时间等待数据。基于延续的编程变得越来越流行的几个原因之一。让我们考虑一些规则的程序代码:

string a = db.StringGet("a");
string b = db.StringGet("b");

按照这些关联的步骤,这看起来像:

    [req1]                         # 客户端 : 客户端库构造出一个请求1
         [c=>s]                    # 网络   : 请求1被发送到服务器
              [server]             # 服务器 : 服务器处理请求1
                     [s=>c]        # 网络   : 响应1被发送回客户端
                          [resp1]  # 客户端 : 客户端库解析响应数据1
                                [req2]
                                     [c=>s]
                                          [server]
                                                 [s=>c]
                                                      [resp2]

现在让我们突出客户端处理的部分:

[req1]
     [====waiting=====]
                      [resp1]
                            [req2]
                                 [====waiting=====]
                                                  [resp2]

记住这是不可测量的,如果是用时间来衡量,那么会一直等待下去(一直耗费时间在等待处理)。

管道

由于这个原因,很多Redis客户端允许你利用管道,处理发送多个消息而无需等待每一个的回复,并且当消息进来的时候,回复的处理将会延后。在.NET中,一个操作可以被初始化且尚未完成;在完成后或者发生错误后由TPL通过 Task/Task\

var aPending = db.StringGetAsync("a");
var bPending = db.StringGetAsync("b");
var a = db.Wait(aPending);
var b = db.Wait(bPending);

注意:在这里我使用了 db.Wait 因为他会自动的应用同步超时配置,如你你喜欢的话,你也可以使用 aPending.Wait() 或者 Task.WaitAll(aPending, bPending);使用管道允许我们在网络中立即得到两个请求,从而消除大部分的延时。此外,它也可以帮助我们减少包碎片:20个请求单独的发送(等待每个响应)至少需要20个包,但是在管道中发送20个请求只需要少数几个包(甚至只需要一个包)。

即发即弃

一个特别的管道案例是当我们不关心操作的响应,允许代码继续执行且排队操作是在后台处理的时候。这通常意味着我们能把并发工作放在来自一个单独调用的连接中。我们可以使用 flags 参数来实现:

// 可调期限
db.KeyExpire(key, TimeSpan.FromMinutes(5), flags: CommandFlags.FireAndForget);
var value = (string)db.StringGet(key);

FireAndForget 标记会使客户端库去正常的排队工作,但是会立即返回一个默认值(KeyExpire 会返回一个 bool 类型,这将返回 false,因为默认值是 false - 然而返回的是毫无意义的值,我们应该忽略)。*Async 方法也会返回一个已完成的 Task\

多路复用(Multiplexing)

使用管道处理技术是非常好的,但是我们经常单独使用阻塞代码仅去取一个单独的值(或者可能只执行一些操作,这取决于各自的需要)。这意味着我们仍然有这样一个问题:我们花费大量的时间去等待数据从客户端传输到服务器端。现在我们考虑一个繁忙的应用,这可能是一个web服务。这类应用通常都具有高并发性,当你有20个并行应用请求所有需要的数据,你可能想旋转(spinning up)这20个连接,或者你可以同步访问一个单独连接(这意味着最后的调用者需要等待前面19个全部执行完成才开始)。或者作为一个妥协方式,也许是个出租5个连接的连接池–不管你怎么做,都会有大量的等待操作。StackExchange.Redis 不需要那样做;反而,它为你做了大量的工作,通过多路复用单个连接,使你可以有效的利用空余的时间。当不同的调用方同时访问时,它会自动使用管道分离访问请求,所以无论使用阻塞方式或者异步方式访问,这些工作都是被管道处理的。因此我们可以有10或者20个先前的”get a and b”的场景(来自不同应用的请求),并且它们会尽快的取得连接。从本质上讲,它填补了 waiting 时间与其他调用方的工作。

因此,StackExchange.Redis不会提供(并将永远不会提供)”阻塞弹出(blocking pops)”(BLPOP, BRPOP 以及 BRPOPLPUSH) - 因为这将允许一个单独的调用方拖延整个多路复用器,进而阻塞所有的调用方。
StackExchange.Redis 需要保持的工作是为了验证某个事务的前提条件,这就是为什么StackExchange.Redis封装了这样的条件在内部管理 Condition 实例。更多事务信息。如果你想要”阻塞弹出(blocking pops)”,那么我强烈建议你考虑使用发布/订阅功功能:

sub.Subscribe(channel, delegate {
    string work = db.ListRightPop(key);
    if (work != null) Process(work);
});
//...
db.ListLeftPush(key, newWork, flags: CommandFlags.FireAndForget);
sub.Publish(channel, "");

注意:无需阻塞操作即可达到相同的目的有:

  • 数据不是通过发布/订阅发送的;发布/订阅API仅被用来通知工人来检查更多的工作

  • 如果没有工人,那么新项仍然在缓冲列表中,工作不会执行

  • 仅有一个工人能弹出一个值;当消费者多于生产者,一些消费者将得到通知然后发现没有什么可做的

  • 当你重新启动工人,你应该假设有积压工作可以处理

  • 除此之外,对于阻塞弹出的语义是相同的

并发

应该注意的是管道/多路复用器/future-value 等方式与基于
延续的异步代码也是做得非常好的;例如:

string value = await db.StringGet(key);
if (value == null) {
    value = await ComputeValueFromDatabase(...);
    db.StringSet(key, value, flags: CommandFlags.FireAndForget);
}
return value;
易灵思FPGA-软件Efinity和Modelsim联仿设置 文章目录前言一、modelsim破解过程二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智 阅读详情

相关推荐

CST新手必看:共面波导色散曲线绘制全流程(附参数设置详解)

本文为CST新手提供了绘制共面波导色散曲线的完整流程与参数设置详解。从模型搭建、周期性边界条件设置,到本征模求解器配置和参数扫描技巧,逐步解析关键步骤,并分享后处理与结果验证方法,帮助用户高效完成仿真任务。

j0k1l2m3n的博客 421

C#与Redis深度集成:从客户端选型到生产级性能优化实战

在分布式系统和高并发场景中,缓存是提升应用性能的核心技术之一。其原理是将热点数据存储在访问速度更快的介质中,减少对后端数据库的直接压力,从而显著降低响应延迟。Redis作为一种高性能的内存数据结构存储,凭借其丰富的数据类型和原子操作特性,在缓存、会话存储、排行榜和消息队列等场景中展现出巨大技术价值。本文聚焦于C#生态中Redis的工程实践,深入对比了StackExchange.Redis、CSRedisCore等主流客户端库的优劣,并详细阐述了如何通过连接池管理、管道化操作和Lua脚本等高级特性来优化性能。

cuixie2370的博客 395

电子产品设计中EFT防护的关键技术与实践

本文深入探讨了电子产品设计中EFT(快速瞬变脉冲群)防护的关键技术与实践。文章从EFT干扰的原理入手,系统阐述了通过优化PCB布局与地平面设计、构建电源与信号端口滤波防护电路、精选核心器件以及实施软件容错策略,来构建多层次、系统性的抗干扰防线,助力产品稳定通过严苛的电磁兼容测试。

e4f5g6h的博客 786

C# Redis库StackExchange.Redis,使用SortSet

1、StackExchange的安装可以参考: https://www.cnblogs.com/cang12138/p/8884362.html https://www.cnblogs.com/liqingwen/p/6672452.html https://www.cnblogs.com/wangyulong/p/8656215.html 2、我自己参考写的封装 (1)redis.cs...

china_jiangdong的专栏 2301

Oracle EBS AP发票被预付款核算创建会计科目时间超长

在客户职能部门的水电、通信和物业等费用统一管理或对接部门报销时,用户将所有费用分摊到各个末级部门,导致AP发票行数高达上千行。这引发了以下问题:1)用户过账时,创建会计科目的请求执行超过20小时未完成,只能手动取消;2)取消请求后,系统一直处于回滚状态;3)通过SQL脚本分析,发现预付发票核销分配行表记录数量庞大,单笔AP发票记录高达90多万条,类似发票共有5笔。

陈显平的专栏-Oracle EBS 350

手把手教你学Simulink--Simulink智能驾驶场景挑战:高速公路入口匝道汇入仿真

高速公路入口匝道汇入在智能驾驶中的作用是当车辆从入口匝道进入主干道时,系统能够自主决策并执行汇入操作,确保安全和高效。目标识别与跟踪:如检测前方障碍物、识别车道线。路径规划:如计算最优汇入路径。动态控制:如调整速度、转向等以完成汇入动作。本示例将展示如何使用Simulink构建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行验证。通过本指南,我们介绍了如何基于Simulink搭建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行仿真和性能评估。背景介绍。

MHD0815的博客 261

StackExchange Redis如何实现BRPOP/BLPOP

今天在使用StackExchange Redis客户端时。我想要使用BRPOP,但是我发现StackExchange Redis并没有提供API,没办法只好找资料看文档了。 原来StackExchange Redis使用的是Multiplexing(多路复用),也就是说它只跟redis server维持单个连接。当有并发请求时,它会自动使用管道(pipeline)发送每个请求,每个请求都需要等待...

weixin_30545285的博客 622

SAP ABAP SM50 的另类用途 - ABAP 工作进程对数据库表读取操作的检测

今天是2020年五一国际劳动节,Jerry祝大家劳动节快乐。 虽然五一国际劳动节来源于一百多年前国外无产阶级的一次大罢工,但由于国情原因,国内很多行业的从业人员,好像天生就是劳碌命。比如程序员行业。 2014年五一劳动节,我在和一个不是总能重现的SAP CRM incident做斗争。详情参考Jerry之前的文章记一次SAP开发工程师给微软Azure报incident的体验. 当时处理完这个复杂...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 8673

网络模型-IO多路复用

网络模型-IO多路复用

admin3335的博客 854

详解大模型微调数据集构建方法(持续更新)

本文详细介绍了大模型微调数据集构建方法,希望能对学习大模型的同学们有所帮助。 文章目录 1. 前言 2. 微调数据集构建方法 2.1 方法一 2.2 方法二 2.3 方法三 2.4 方法四 2.5 方法五

herosunly的博客 28万+

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5160

推荐开源项目:StackExchange.Redis 中文文档

推荐开源项目:StackExchange.Redis 中文文档 项目简介 是一个由 Carl Davidson 开发并维护的 .NET 客户端库,用于与 Redis 数据库存储进行高效交互。该项目提供了丰富的接口和功能,使得.NET开发者在处理分布式缓存、消息队列等场景时更加得心应手。此仓库是 StackExchange.Redis 的官方中文文档,由 Carldai0106 翻译和整理,旨在帮助...

gitblog_00037的博客 968

走向审计4.0:内部审计数字化转型的路径与方法

企业的内部审计人员可以以数字化为手段,建立内部审计新生态,在数字化过程中引进战略审计、服务审计、开放审计、敏捷审计、数字审计、智慧审计等理念、方法和工具,完成数智生态审计转型。内部审计的审计对象远比国家审计和公众审计丰富和多元化,理论上企业经营管理和日常操作的各个方面都可以成为内部审计的对象,此外还可以开展独立咨询活动。由于内部审计的数字化或数字化的内部审计是实现审计数字化转型的必要条件,是实现“数字引领、数据强审”目标的核心手段,因此企业内部审计部门势必要投入足够的资金和人才来打造一支数字化审计新队伍。

一键难忘的博客 6736

redis 查看key的有效期_Redis中取得所有Key、过期时间配置与获取、Key过期通知。...

string connection = "127.0.0.1:6379,password=xxxxx,connectRetry=5";[TestMethod]public voidTestSet(){var mutlti =StackExchange.Redis.ConnectionMultiplexer.Connect(connection);var db = mutlti.GetDatabas...

weixin_36239866的博客 954

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

StackExchange.Redis管道与多路复用:如何实现高吞吐量通信的终极指南

在现代分布式应用中,Redis已成为不可或缺的缓存和数据存储解决方案。然而,网络延迟往往是性能瓶颈的主要元凶。StackExchange.Redis作为.NET生态中功能强大的Redis客户端,通过其独特的管道(Pipelining)和多路复用(Multiplexing)技术,实现了高吞吐量通信的革命性突破。🚀 ## 为什么需要管道与多路复用? 想象一下这个场景:你需要从Redis获取两个键

gitblog_00799的博客 716

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

StackExchange.Redis 文档翻译

写在开始 ServiceStack.Redis从4.0版本开始收费使用,好在好的东西不存在没有开源免费的; 大名鼎鼎的Stack Overflow就提供了它的Redis客户端库:StackExchange.Redis免费给我们使用。 看到网上很少有关于StackExchange.Redis的翻译,并且通读了下有些地方很费解;个人本着学习共享精神翻译了一下, 翻译应该有一些错误(由于英语水平有限,...

weixin_34247299的博客 76

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

揭秘C#缓存架构设计:如何用Redis 7.2与MemoryCache实现毫秒级响应

掌握C#实现分布式缓存(Redis 7.2+MemoryCache)的完整方案,解决高并发下数据响应延迟问题。适用于微服务、电商秒杀等场景,结合Redis分布式共享与MemoryCache本地加速,提升系统性能至毫秒级响应。架构清晰、扩展性强,值得收藏。

Instrulink的博客 902

Redis的介绍以及简单使用连接池

详细介绍了Redis的介绍以及简单使用连接池

主要发布一些日常学习代码及理解 1051

redis key过期时间的监听

第一步修改配置文件############################# EVENT NOTIFICATION ############################### Redis can notify Pub/Sub clients about events happening in the key space.# This feature is documented at http:...

qq_15555767的博客 2848

c# StackExchange.Redis常用API

String 字符串 StringSet: 1.设置一个String值 2.设置多个String值,要么都设置成功,要么都失败! 非常有用 StringSetRange: 1.从偏移量offset 开始 使用 value 填充。 如果原来的长度小于offset 中间使用’\0’字符填充(注意,c# 使用 '\0’字符结尾,这种情况导致替换后的字符根本无法显示出来。) 返回值是替换后的字符串长度 例...

磨刀不误砍柴工 5144

第12章 初识消息队列(MessageQueuing)

通过Redis分布式缓存数据库或RabbitMQ实现消息队列(MessageQueuing)

zhoujian_911的专栏 1190

【C#与Redis】--高级主题--Redis 管道

Redis管道是一种用于优化多个命令执行的机制,允许客户端将多个命令一次性发送给服务器,然后一次性接收所有命令的返回结果。这种机制可以减少客户端与服务器之间的网络往返次数,从而提高性能。Redis管道是一种优化性能的机制,通过批量执行多个命令、异步操作和原子性保证,提高了系统吞吐量和降低延迟。在C#中使用StackExchange.Redis库,可以通过创建管道,一次性发送多个命令。优化管道中命令的顺序、考虑网络稳定性、注意事务与管道的兼容性等是使用管道时的注意事项。

喵叔 1807

StackExchange.Redis官方文档(六)【事件,发布订阅,服务器命令】

事件 ConnectionMultiplexer 类型公开了多个事件,可以用来了解正在发生的事件。这是非常有用的特别是在记录日志的时候: ConfigurationChanged 当 ConnectionMultiplexer 里面的连接配置被更改后触发 ConfigurationChangedBroadcast 通过发布/订阅功能接受到一个重新配置的消息的时候;这通常是由于使用 IServ

极客神殿 2265

StackExchange.Redis官方文档(五)【事务】

Redis中的事务Redis的事务是与SQL数据库不同的。详细了解请参考文档,转述如下:Redis的事务:先以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务。当碰到命令:MULTI (标记一个事务块的开始),在该连接上的命令不会执行:它们会排队(调用方会得到每个队列的回复)。当遇到命令:EXEC(执行所有事务块内的命令),它们被应用到一个单独的单元中(比如:

极客神殿 2708

RedisStackExchange Helper的封装

前述: 最开始用的是ServiceStack.Redis,但是从4.0版本开始商业化之后,有每个小时访问次数限制6000次访问。这个就很烦了,后来就改成了使用RedisStackExchange。 public class RedisStackExchange { #region private field private static I...

歇息的专栏 541

Redis数据库——键过期时间

我们可以在Redis客户端输入命令,可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在指定秒数或者毫秒数之后,服务器会自动删除生存时间为0的键。

weixin_57023347的博客 4578
上一篇: StackExchange.Redis官方文档(二)【配置】
下一篇: StackExchange.Redis官方文档(四)【键、值以及通道】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值