首页 > 解决方案 > Redis:如何计算某个范围内的流中的元素?

问题描述

经营目标

我正在创建一个依赖于一些时间序列的仪表板,我将使用 Redis 来实现它。我是使用 Redis 的新手,我正在尝试使用 Redis-Streams 来计算流中的元素。

XADD conversation:9:chat_messages * id 2583 user_type Bot
XADD conversation:9:chat_messages * id 732016 user_type User
XADD conversation:9:chat_messages * id 732017 user_type Staff
XRANGE conversation:9:chat_messages - +

我知道我可以使用 XLEN 命令获取元素的总数,如下所示:

XLEN conversation:9:chat_messages

但我也想知道一个时期的元素,例如:

XLEN conversation:9:chat_messages 1579551316273 1579551321872

我知道我可以使用 LUA 来计算这些元素,但我想要一些真正快速的方法来实现这一点,而且我知道使用 Redis 标记将是最快的方法。

有没有办法通过直接的 Redis 命令来实现这一点?还是我必须编写一个 Lua 脚本才能做到这一点?

附加信息

我受 AWS 的 ElastiCache 限制只能使用 Redis 5.0.6,我无法安装其他模块,例如RedisTimeSeries模块。我想使用该模块,但目前不可能。

标签: redisluatime-seriesredistimeseries

解决方案


虽然 Redis Stream 数据结构不支持这一点,但您可以在它旁边使用一个 Sorted Set 来跟踪消息范围。

基本上,对于您从中获得的每个消息 ID XADD- 例如“1579551316273-0” - 您需要执行ZADD conversation:9:ids 0 1579551316273-0. 然后,您可以使用ZLEXCOUNT来获取范围的“长度”。


推荐阅读