Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis:如何在一定范围内计算流中的元素?_Redis_Lua_Time Series_Redistimeseries - Fatal编程技术网

Redis:如何在一定范围内计算流中的元素?

Redis:如何在一定范围内计算流中的元素?,redis,lua,time-series,redistimeseries,Redis,Lua,Time Series,Redistimeseries,业务目标 我正在创建一个仪表板,它将依赖于一些时间序列,我将使用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 use

业务目标

我正在创建一个仪表板,它将依赖于一些时间序列,我将使用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模块。我想使用该模块,但目前不可能使用。

虽然Redis Stream数据结构不支持此功能,但您可以在其旁边使用一个排序集来跟踪消息范围


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

对不起,没有命令可以实现这一点

使用Redis Streams的最佳选择是使用Lua脚本。您将得到O(N),其中N是正在计数的元素数,而不是O(logn)(如果存在命令)

local T = redis.call('XRANGE', KEYS[1], ARGV[1], ARGV[2])
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
请注意,O(N)和O(log(N))之间的差异对于较大的N来说非常重要,但是对于聊天应用程序,如果聊天记录有数百个甚至数千个条目,只要您考虑到总的命令时间(包括占用大部分时间的往返时间),则如果聊天记录有数百个甚至数千个条目,则这不会产生太大的差异。上面的Lua脚本删除了网络负载和客户端处理时间

如果您真的想要O(logn),并且不需要消费群体和其他流功能,您可以切换到排序集。查看是否要原子地使用Redis服务器时间戳

然后你可以使用O(log(N))


如果您确实需要流功能,那么您需要将已排序集保留为二级索引。

在这种情况下,使用哈希而不是Redis流不是一样的吗?哈希不会为您提供基于时间戳的id,并且可以假设您使用的是其他流功能。注意“1579551316273-10”出现在“1579551316273-2”之前的意义上的lex计数。对于char应用程序来说,这很可能不是问题,因为在同一毫秒内您需要10个以上的条目,但其他应用程序可能非常正确@LeoMurillo-在这种情况下,确实需要在亚毫秒部分填充0。