控制 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,一经查实,立即删除!

相关文章

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的工…

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 更多详…

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…

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;专业补刀二十年&…

IronRuby - 如何在VS2010下调试IronRuby代码

在OpenExpressApp &#xff0d; 使用VS2010的CodedUI来做自己的自动化测试框架中介绍了我将使用IronRuby进行测试框架的编写。虽然Ruby已经非常的流行&#xff0c;我所在公司有的项目也深入的应用过&#xff0c;但它对于我来说还是非常新的&#xff0c;对它的认识也就是快速的看…

AgileConfig轻量级配置中心1.4.0发布,重构了发布功能

加入 NCC 先说一个事&#xff0c;AgileConfig 在 7 月底终于通过了 NCC 社区的审核&#xff0c;正式成为了 NCC 大家庭的一员。这对 AgileConfig 来说是一个里程碑&#xff0c;希望加入 NCC 后能更好的帮助到大家。同时责任也更大了&#xff0c;本人会一如既往的对这个项目维护…

你为什么不爱发朋友圈了?

全世界只有3.14 % 的人关注了爆炸吧知识想发自拍、想秀恩爱、想分享生活状态但一想到别人指手画脚的评论发朋友圈这件事便索然失味人生是不是已经了无生趣了呢关注以下这几个优质订阅号远离朋友圈的日子令你耳目一新不信你就扫码试试RSS精选ID&#xff1a;KindleNewsRSS精选是一…

IE6下z-index犯癫不起作用bug的初步研究

by zhangxinxu from http://www.zhangxinxu.com 本文地址&#xff1a;http://www.zhangxinxu.com/wordpress/?p471 一、匆匆带过的概念 关于CSS中层级z-index的定义啊什么的不是本文的重点&#xff0c;不会花费过多篇幅详细讲述。这里就简单带过&#xff0c;z-index伴随着层的…

C#读取INI文件

虽然微软早已经建议在WINDOWS中用注册表代替INI文件&#xff0c;但是在实际应用中&#xff0c;INI文件仍然有用武之地&#xff0c;尤其现在绿色软件的流行&#xff0c;越来越多的程序将自己的一些配置信息保存到了INI文件中。 INI文件是文本文件,由若干节(section)组成,在每个带…

电子报账系统源码_亲清直播间 | “互联网+财税”引领企业专票电子化变革

2019年11月27日&#xff0c;国务院常务会议要求“ 2020年年底前实现增值税专用发票电子化”&#xff0c;这标志着将增值税专用发票电子化工作正式提上日程。2020年8月3日&#xff0c;国家税务总局发布《关于进一步支持和服务长江三角洲区域一体化发展若干措施的通知》(税总函〔…

Dapr牵手.NET学习笔记:想入非非的服务调用

demo运行环境&#xff1a;Windows10&#xff0c;Docker(dapr_zipkin&#xff0c;dapr_redid&#xff0c;dapr_placement)安装&#xff1a;dapr init卸载&#xff1a;dapr uninstall&#xff0c;然后删除 C:\Users\当前用户\.daprdapr在部署时是通过给服务挂载一个sidecar&#…

老婆晚上不想睡?这个操作你要会!

1 会跪键盘吗&#xff1f;2 吃鸡时捡装备的你3 这是个失败之作4 是时候让你见识什么叫真正的技术了 5 别人的老师 6 陷入僵橘7 恐高者慎看你点的每个赞&#xff0c;我都认真当成了喜欢

java中JOptionPane类_java:JOptionPane类消息框总结

最近在写projet时经常用到JOptionPane的消息提示框&#xff0c;今天在这里做一个总结。主要用到四种消息提示框方法&#xff1a;showMessageDialog()&#xff1a;消息对话框showOptionDialog()&#xff1a;选择对话框showInputDialog()&#xff1a;输入对话框showConfirmDialog…

每天扫扫扫,二维码会被我们扫完吗?

全世界只有3.14 % 的人关注了爆炸吧知识支付码、名片码、健康码、校园码、复学码、乘车码、挪车码码码码码码码码码码码码码码码码码码码码码码码码码码&#xff0c;这么多码&#xff1f;光疫情期间&#xff0c;就用掉了 1400亿个二维码&#xff0c;那么就有同学来问了&#xf…