控制 Redis stream 的消息数量

控制 Redis stream 的消息数量

Intro

Redis Stream 是 Redis 5.0 引入的一个新的类型,之前我们介绍过使用 Redis Stream 来实现消息队列,可以参考之前的文章 使用 Redis Stream 实现消息队列,而 Stream 的消息会持久化地内存中,如果我们不控制消息数量的话,可能会出现大量的消息存在内存里导致过大的内存占用,Redis Stream 5.0 开始支持根据 Max Length 来控制 Stream 的长度(消息数量),从 6.2 开始支持根据消息 Id 来控制 Stream 的长度,默认地消息 Id 是一个时间戳,所以使用默认地 Id 也可以理解为按时间来控制 Stream 长度,下面我们来看使用示例吧

Redis 语法

控制 Stream 消息长度有两个 Redis 命令,一个是 XTRIM 只做 Trim 操作,把不满足要求的消息去除,另外一个是 XADD 在添加 Stream 消息的同时做 Trim 操作,简化还要多一步 Trim 的操作,将添加消息和控制消息长度可以合并为一个操作

XTRIM 语法:

XTRIM key MAXLEN|MINID [=|~] threshold [LIMIT count]

使用示例:

XTRIM mystream MAXLEN 1000
XTRIM mystream MINID 649085820XTRIM mystream MAXLEN ~ 1000(Nearly trim,不准确,可能有些消息该删掉的会保留下来,但是执行效率会比 `=`(Exactly Trim) 高一些)
XTRIM mystream MINID = 649085820

Trimming the stream can be done using one of these strategies:

  • MAXLEN: Evicts entries as long as the stream's length exceeds the specified threshold, where threshold is a positive integer.

  • MINID: Evicts entries with IDs lower than threshold, where threshold is a stream ID.

XADD 语法:

XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]

使用示例:

redis> XADD mystream * name Sara surname OConnor
"1631546114612-0"
redis> XADD mystream * field1 value1 field2 value2 field3 value3
"1631546114612-1"redis> XADD mystream MAXLEN ~ 1000 field1 value1
redis> XADD mystream MINID ~ 1631546460687 field1 value1

XADD 允许用户在向 Stream 里添加消息的时候控制消息的长度返回值是消息ID,默认是一个时间戳,语法如上,可以 Trim 也可以 不Trim,可以根据需要选择

Prepare

先来准备一些帮助类和公共方法,下面的示例是基于 StackExchange.Redis 来实现的

RedisHelper,获取 Redis 连接

internal static class RedisHelper
{private static readonly IConnectionMultiplexer ConnectionMultiplexer = StackExchange.Redis.ConnectionMultiplexer.Connect("127.0.0.1:6379");public static IDatabase GetRedisDb(int dbIndex = 0){return ConnectionMultiplexer.GetDatabase(dbIndex);}
}

AddStreamMessage,向指定 stream 中添加若干条消息

private static async Task AddStreamMessage(string key, int msgCount, Action action=null)
{var redis = RedisHelper.GetRedisDb();for (var i = 0; i < msgCount; i++){await redis.StreamAddAsync(key, "messages", $"val-{i}");action?.Invoke();}
}

Max-Length

根据 MaxLength 来控制 Stream 长度示例

var streamKey = $"stream-{nameof(MaxLengthTrim)}";
await AddStreamMessage(streamKey, 10);
var redis = RedisHelper.GetRedisDb();
Console.WriteLine(await redis.StreamLengthAsync(streamKey));// trim directly
await redis.StreamTrimAsync(streamKey, 5);
Console.WriteLine(await redis.StreamLengthAsync(streamKey));// add with trim
await redis.StreamAddAsync(streamKey, StreamMessageField, "Test", maxLength: 3);
Console.WriteLine(await redis.StreamLengthAsync(streamKey));await redis.KeyDeleteAsync(streamKey);

输出结果如下:

Min-ID

根据 Min-ID 来控制 Stream 消息长度,是 Redis 6.2 新引入的功能,目前 StackExchange.Redis 还没有专门的 API 来支持这个功能,不过我们可以通过 Execute 来执行 Redis 命令,通常这些 Redis 客户端库都会支持直接调用 Redis 命令,根据 MinID 控制 Stream 长度示例如下:

private const string StreamAddCommandName = "XADD";
private const string StreamTrimCommandName = "XTRIM";private const string StreamAddAutoMsgId = "*";private const string StreamTrimByMinIdName = "MINID";private const string StreamTrimOperator = "=";private const string StreamMessageField = "message";private static async Task MinMsgIdTrim()
{var streamKey = $"stream-{nameof(MaxLengthTrim)}";await AddStreamMessage(streamKey, 10, () => Thread.Sleep(1000));var redis = RedisHelper.GetRedisDb();var minId = DateTimeOffset.UtcNow.Subtract(TimeSpan.FromSeconds(5)).ToUnixTimeMilliseconds();Console.WriteLine(await redis.StreamLengthAsync(streamKey));// https://redis.io/commands/xtrim// trim directlyawait redis.ExecuteAsync(StreamTrimCommandName, streamKey,StreamTrimByMinIdName,StreamTrimOperator, // optionalminId);Console.WriteLine(await redis.StreamLengthAsync(streamKey));minId = DateTimeOffset.UtcNow.Subtract(TimeSpan.FromSeconds(2)).ToUnixTimeMilliseconds();// https://redis.io/commands/xadd// add with trimvar result = redis.Execute(StreamAddCommandName, streamKey, StreamTrimByMinIdName, StreamTrimOperator, // optionalminId,StreamAddAutoMsgId, StreamMessageField, "Test");Console.WriteLine(await redis.StreamLengthAsync(streamKey));await redis.KeyDeleteAsync(streamKey);
}

上述代码输出结果如下:

More

本文主要介绍了控制 Redis Stream 的消息长度,除了介绍 Redis 本身的命令之外,也是介绍一下如何使用 StackExchange.Redis 实现调用没有 API 支持的 Redis 命令,Redis 6.2 之后支持了很多新的特性,但是很多库都还太支持,了解如何原生调用 Redis 命令有些时候会很有帮助

References

  • https://redis.io/commands/xadd

  • https://redis.io/commands/xtrim

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/RedisSample/StreamTrimSample.cs

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

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

相关文章

java oom-killer_与Linux OOM-killer的第一次亲密接触

From1、最近一段时间(更换了预发机器后)我负责的一个应用的预发环境(线上稳定得像个婴儿~)特别不稳定&#xff0c;最先是应用频频的过几天就发现提供的接口不工作了&#xff0c;但容器Jetty还在跑得欢&#xff0c;于是jstack/jmap看&#xff0c;发现没有一个线程在跑我的war包中…

CentOS+lighttpd+php+mysql (fastcgi)环境的搭建(转)

呵呵&#xff01;觉得有必要把今晚的装lighttpd的经验和过程给记录下来&#xff01; 第一次写这样的文章&#xff0c;有什么不足的地方请高手们指出并给与修正&#xff01;下面开始&#xff01; 第一步&#xff1a;系统的安装&#xff01; 菜鸟的朋友们&#xff0c;可以先去lin…

vpx8运行待解决问题

一开始运行的时候是因为找不到HAVE_CONFIG_H他的定义&#xff0c;所以编译无法通过&#xff0c;找了好久还是没有找到&#xff0c;所以就先把它给注释掉了&#xff0c;结果运行的时候还是无法通过&#xff0c;运行的结果如下&#xff1a; 希望赶紧找到解决的办法 1>------ B…

led灯具供货合同

美高森美与索尼合作推出首款具3D功能的定时控制器与局部调光LED背光组合解决方案在刚刚结束的第十一届国际集成电路研讨会暨展览会&#xff08;IIC-China 2011&#xff09;上&#xff0c;美高森美公司(Microsemi)展示了与索尼合作推出的目前市场上首款具有3D功能的定时控制器与…

startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...

引言本文是对《redis设计与实现(第二版)》中数据结构与对象相关内容的整理与说明。本篇文章只对对象结构&#xff0c;1种对象——字符串对象。以及字符串对象所对应的两种编码——raw和embstr&#xff0c;进行了详细介绍。表达一些本人的想法与看法&#xff0c;也希望更多朋友一…

网友半夜差点被沐浴露吓死,众人:原来不止我胆小....

全世界只有3.14 % 的人关注了爆炸吧知识微博上有网友爆料说&#xff0c;他半夜上厕所差点被沐浴露吓死&#xff01;这么看可能不明显但是关灯的时候.....啊啊啊啊啊&#xff5e;结果引来众多网友的共鸣&#xff0c;原来大家都有类似遭遇....比如&#xff0c;你有被饮水机吓到过…

.NET 6 RC1 正式发布

昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本&#xff0c;该版本将于11月正式发布&#xff0c;作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现。这是一个从2014年开始&#xff0c;持续多年的&#xff0c;以改变应用开发游戏规则的努力&#xff0c;由…

Winform开发中另一种样式的OutLookBar工具条

很早的时候&#xff0c;曾经写了一篇随笔《WinForm界面开发之“OutLookBar”工具条》介绍了OutLookBar样式的工具条&#xff0c;得到很多同行的热烈反馈&#xff0c;我个人也比较喜欢这样的工具条布局&#xff0c;因此我很多共享软件中&#xff0c;都经常看到这种OutLookBar的工…

常用小知识

在linux 上生成一个字符串的MD5 &#xff0c;可以直接用linux 上的命令&#xff1a;#md5sumecho -n ’123456′ | md5sum 这样及可。vi 使用&#xff1a;^ 到行首$ 到行尾yy 复制一行p 粘贴u 回退-------------------------------------------------------------------she…

重构的小故事 Change Value to Reference or Vice Verse

值和引用&#xff0c;有时候程序员因为熟悉而忽略了它们之间的区别&#xff0c;因此使用的时候也就不做选择信手拈来。得到预期结果就行&#xff0c;得不到预期结果就换下试试&#xff0c;毕竟两者有其一。那到底是值还是引用呢&#xff1f;有这样一个生活中的故事。<?xml:…

r语言主成分分析_PCA主成分分析

PCA主成分分析最近遇到了主成分分析法这个东西&#xff0c;一开始我觉得简直天才啊&#xff0c;这个想法虽然从经济意义上来解释有点奇怪&#xff0c;毕竟是数学方法计算出来的解释因子&#xff0c;但鉴于没人知道现实世界究竟被多少因素影响&#xff0c;这种方法可以将最主要的…

宫崎骏动画里的新垣结衣见过没?简直美呆!

全世界只有3.14 % 的人关注了爆炸吧知识本文经机器之心&#xff08;ID&#xff1a;almosthuman2014&#xff09;授权转载参与&#xff1a;肖清、思尽管最近 2019 年的图灵奖颁给了计算机图形学、颁给了皮克斯 3D 动画&#xff0c;但很多人可能认为二维动漫更有意思一些。像宫崎…

更了吗?Windows 11 22000.184 推送

面向 Beta 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 预览版 Build 22000.184。Windows 11 Insider Preview Build 22000.184 主要变化如下&#xff1a;1.微软现已修复在Windows 11 OOBE&#xff08;开箱体验&#xff09;阶段了解 Windows Hello 更多详…

java 快速io_如何快速理解Java的IO流

初学者觉得IO流复杂是很正常的&#xff0c;归根结底是没有理解JavaIO框架的设计思想&#xff1a;可以沿着这条路想一想&#xff1a;1&#xff0c;学IO流之前&#xff0c;我们写的程序&#xff0c;都是在内存里自己跟自己玩。比如&#xff0c;你声明个变量&#xff0c;创建个数组…

Effective C++ 学习笔记(11)

确定基类有虚析构函数 class A{public: A() { cout<<"A constructor"<<endl; }~A() { cout<<"A destructor"<<endl; }};class B: public A{public: B() { cout<<"B constru…

微软职位内部推荐-Software Development Engineer 2

微软近期Open的职位:SDE IIOrganization Summary:Engineering, Customer interactions & Online (ECO) is looking for a great "Software Development Engineer" to join our team. Customer support is a strategic differentiator for Microsoft and we are i…

C#判断某软件是否安装

代码 privatevoidbutton1_Click(objectsender, EventArgs e) { if(checkAdobeReader() true) { MessageBox.Show("有安裝 Adobe Reader "); } else{ MessageBox.Show("沒有安裝 Adobe Reader "); } …

男朋友和女朋友的区别。。。

1 区别于这耳光来的也是猝不及防。。。2 铲屎官做的一个防止猫咪抢食的装置大概就是这只橘猫保持苗条的秘籍吧3 学生时代的爱情大概就是这样吧。。4 这样的哥哥给我来一打&#xff01;5 据我多年经验&#xff0c;应该是溺水身亡了6 治婊专家陈豪&#xff0c;专业补刀二十年&…

如何在 C# 循环中捕获局部变量?

咨询区 Morgan Cheng&#xff1a;我遇到了一个有趣的问题&#xff0c;它的代码大概是这样的。List<Func<int>> actions new List<Func<int>>();int variable 0; while (variable < 5) {actions.Add(() > variable * 2); variable; }foreach (v…

java创建计数器变量,用于检查变量(计数器)最大长度的Java方法

Kindly please anyone who knows is the any method to knowwhat is the limit of length of a counter?Depsite from initiliazed variables types (either int, byte, long etc)is there any way for me to check my variable (counter)s max lenght?Please share the info…