Beetlex.Redis之Stream功能详解

有一段时间没有写文章,techempower的测试规则评分竟然发生了变化,只能忘着补充一下占比权重最多的数据更新示例了和深入设计一下组件模块化加载的设计。但在不久前有用户问了一下组件是否支持redis的Stream功能,看了一样相关资料后把功能实现之;接下来就介绍一下如何用Beetlex.Redis来调用redis的Stream功能。

什么是Stream

是Redis5.0的Stream是一个新的强大的支持多播的可持久化的消息队列,它提供了消息添加,多组和多消费者一致性读取和ack确认等功能;更详细的介绍就不多说了可以通过网络找到更多详细描述。

创建Stream

组件通过RedisDB对象的GetStream访求来创建一个Stream访问对象,对象创建后就可以进行一系列的 XACK| XADD| XDEL| XGROUP| XLEN| XRANGE| XREAD| XREADGROUP| XREVRANGE|XTRIM等指令操作。创建代码如下:

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");

XADD

在介绍这个操作前先说一下Stream里存储的格式,默认Stream消息是K-V的格式,从基础指令上可以了解到这种结构

XADD mystream * sensor-id 1234 temperature 19.8

但这种格式操作起来并不友好,所以组件除了支持这种K-V的方式外,还支持以对象的方式进行Stream消息处理。接下来看一下插入对象的调用

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var id = await stream.Add(DataHelper.Defalut.Employees[0]);
id = await stream.Add(DataHelper.Defalut.Employees[1]);
id = await stream.Add(DataHelper.Defalut.Employees[2]);
var len = await stream.Len();

组件支持直接入插对象,其基础指令就是

XADD employees_stream * date employeejson

组件直接采用一个K-V的方式来存储对象,对于原则多个K-V的方式组件同样也支持,只是在构建Stream指定类型用Dictionary<string,string>即可;接下其他就不多说了直接上指令用例了。

XLEN

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var len = await stream.Len();

XDEL

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var items = await stream.Read(null, null, "0-0");
await stream.Del((from item in items select item.ID).ToArray());

XRANGE

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var items = await stream.Range();
items = await stream.RangeAll();

XREVRANGE

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var items = await stream.RevRange();
items = await stream.RevRangeAll();

XREAD

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var items = await stream.Read(0, null, "0-0");
items = await stream.Read();

Stream的消费组

前面介绍的指令感觉列表结构都能满足,其实Stream重要的功能是在组消费这一块,Redis可以针对Stream创建多个消费组和消费者,而消息会做一致性消费处理。

XGROUP

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var group = await stream.GetGroup("henry");

XREAD

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var group = await stream.GetGroup("g1");
var items = await group.Read("henry", "0");

实际XRead提供了是否等待和起始读已取参数

 public async ValueTask<List<StreamDataItem<T>>> ReadWait(string consumer,int timeout=0public ValueTask<List<StreamDataItem<T>>> Read(string consumer,string start = null) public async ValueTask<List<StreamDataItem<T>>> Read(string consumer, int? block, int? count, string start = null)

一般情况下可以通过readwait来不停地消息新的消息

while(true)
{items = await group.ReadWait("henry");//处理消息foreach(var item in items){await item.Ack();}
}

XACK

RedisStream<Employee> stream = DB.GetStream<Employee>("employees_stream");
var group = await stream.GetGroup("g1");
var items = await group.Read("henry", "0");
foreach (var item in items)await item.Ack();

以上是BeetleX.Redis组件提供操作Stream的基础指令,实际上Stream还有一些和运维相关的指令,只是这些在实际业务上用不上所以就没有去实现了。


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

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

相关文章

一文说通Dotnet Core的后台任务

这是一文说通系列的第二篇&#xff0c;里面有些内容会用到第一篇中间件的部分概念。如果需要&#xff0c;可以参看第一篇&#xff1a;一文说通Dotnet Core的中间件一、前言后台任务在一些特殊的应用场合&#xff0c;有相当的需求。比方&#xff0c;我们需要实现一个定时任务、或…

[JavaWeb-XML]XML组成部分

组成部分&#xff1a; 1. 文档声明1. 格式&#xff1a;<?xml 属性列表 ?>2. 属性列表&#xff1a;* version&#xff1a;版本号&#xff0c;必须的属性* encoding&#xff1a;编码方式。告知解析引擎当前文档使用的字符集&#xff0c;默认值&#xff1a;ISO-8859-1* st…

2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

题意&#xff1a; 给你n个小于101810^{18}1018的大数&#xff0c;问在可以再不改变序列位置&#xff0c;之改变数值中某数位的‘9’变为‘6’或将‘6’变为‘9’&#xff0c;求的最终序列由小到大&#xff0c;且字典序最小。 题目&#xff1a; 链接&#xff1a;https://ac.n…

用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库

点击上方“Dotnet9”添加关注哦Blazor一、前言今天在下班的路上&#xff08;地铁上&#xff09;&#xff0c;站长习惯性的掏出手机&#xff0c;就收到知乎向站长推送的一篇BlazorUI组件库推荐文章&#xff0c;是码云官方的&#xff1a;原文链接[1]&#xff0c;于是我立即打开码…

2021年度训练联盟热身训练赛第五场F题Group Project

题意&#xff1a; 有n个人&#xff0c;其中有m组&#xff0c;两两互斥&#xff0c;现在要分成两个班&#xff0c;但最终求的确是最多有多少对不互斥的。 题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/16741/F 来源&#xff1a;牛客网 The big day…

[JavaWeb-XML]XML约束概述

约束&#xff1a;规定xml文档的书写规则 * 作为框架的使用者(程序员)&#xff1a;1. 能够在xml中引入约束文档2. 能够简单的读懂约束文档* 分类&#xff1a;1. DTD:一种简单的约束技术2. Schema:一种复杂的约束技术

在Asp.NET Core中如何优雅的管理用户机密数据

在Asp.NET Core中如何优雅的管理用户机密数据背景回顾在软件开发过程中&#xff0c;使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法。在早期VB/VB.NET时代&#xff0c;经常使用.ini文件来进行配置管理&#xff1b;而在.NET FX开发中&#xff0c;我们则倾向…

食物链 POJ - 1182

题目&#xff1a; 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两种…

[XML-Jsoup]Jsoup_解析_快速入门

xml常见的解析器&#xff1a; 1. JAXP&#xff1a;sun公司提供的解析器&#xff0c;支持dom和sax两种思想2. DOM4J&#xff1a;一款非常优秀的解析器3. Jsoup&#xff1a;jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

计蒜客 逃生+动态规划

题目&#xff1a; 蒜头君在玩一款逃生的游戏。在一个 nmn \times mnm 的矩形地图上&#xff0c;蒜头位于其中一个点。地图上每个格子有加血的药剂&#xff0c;和掉血的火焰&#xff0c;药剂的药效不同&#xff0c;火焰的大小也不同&#xff0c;每个格子上有一个数字&#xff0…

[XML-Jsoup]Jsoup_对象的使用(Jsoup工具类,Document,Elements,Element,Node)

对象的使用&#xff1a; 1. Jsoup&#xff1a;工具类&#xff0c;可以解析html或xml文档&#xff0c;返回Document* parse&#xff1a;解析html或xml文档&#xff0c;返回Document* parse​(File in, String charsetName)&#xff1a;解析xml或html文件的。* parse​(String ht…

别了,Docker Swarm !你好,K8s !

毫无疑问&#xff0c;Kubernetes已经成为容器编排事实标准。除了已经拥抱Kubernetes的Google、BAT、京东、奇虎360等巨头大厂外&#xff0c;更多的企业也都在向Kubernetes迁移。容器技术大势所趋&#xff0c;是互联网企业目前急需的技术人才之一&#xff0c;已成为运维工程师、…

01背包+概率问题 计蒜客 offer

题目&#xff1a; 蒜头君很早就想出国&#xff0c;现在他已经考完了所有需要的考试&#xff0c;准备了所有要准备的材料&#xff0c;于是&#xff0c;便需要去申请学校了。要申请国外的任何大学&#xff0c;你都要交纳一定的申请费用&#xff0c;这可是很惊人的。蒜头君没有多…

[JavaWeb-XML]XML_解析_解析方式

解析&#xff1a;操作xml文档&#xff0c;将文档中的数据读取到内存中 * 操作xml文档1. 解析(读取)&#xff1a;将文档中的数据读取到内存中2. 写入&#xff1a;将内存中的数据保存到xml文档中。持久化的存储* 解析xml的方式&#xff1a;1. DOM&#xff1a;将标记语言文档一次性…

【翻译】.NET 5 Preview5发布

今天&#xff0c;发布了.NET 5.0 Preview5。主要对它进行了一小部分新功能和性能的改进。.NET 5.0 Preview 4包含了一些计划和.NET 5.0要交付的内容。现在&#xff0c;大多数的功能都已经包含在里面&#xff0c;但是有许多功能还未到最终状态。预计这个版本在Preview 7中完善。…

构造前缀贪心+ 计蒜客 子矩阵求和

题目&#xff1a; 给出一个 nn 行 mm 列的矩阵&#xff0c;矩阵的每个位置有一个非负整数 a[i][j]&#xff0c;有 qq 次询问&#xff0c;每次询问求一个左上角为 (a,b)&#xff0c;右下角为 (c,d) 的子矩阵的所有数之和。 输入格式 第一行两个整数 n,m&#xff0c;表示矩阵的…

[JavaWeb-XML]约束(DTD,Schema)

DTD&#xff1a; * 引入dtd文档到xml文档中* 内部dtd&#xff1a;将约束规则定义在xml文档中* 外部dtd&#xff1a;将约束的规则定义在外部的dtd文件中* 本地&#xff1a;<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">* 网络&#xff1a;<!DOCTYPE 根标签名 …

[跨平台系列三Docker篇]:ASP.NET Core应用

如果你是老张的忠实读者的话&#xff0c;如果是从博客园就开始看我的文章的话&#xff0c;如果后期也一直看我公众号的话&#xff0c;应该就知道其实我一直在根据一条无形的教学线路来讲解的&#xff0c;&#xff0c;如果你真的是想好好学的话&#xff0c;请好好看看我之前的文…

2020牛客国庆集训派对day2 F题 Java大数处理

题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/16913/F 来源&#xff1a;牛客网 The following code snippet calculates the sum of the areas of all the sub rectangular grid in a rectangular grid from (0,0) to (N,N)\ .(N,N) . Find an eff…