gpt4 book ai didi

redis - 如何从 Redis 流中删除或删除给定数量的条目?

转载 作者:行者123 更新时间:2023-12-03 06:45:56 25 4
gpt4 key购买 nike

Redis XTRIM 命令允许您声明要保留的条目数,但是如果我想声明要删除的条目数呢?

例如,如果我有一个不断接收新条目的流,我想删除最旧的 100 个条目,我不能简单地执行 XLEN myStream然后调用XTRIM myStream MAXLEN <xlen result - 100> ,因为在两个命令之间添加了新条目,它将删除超过 100 个条目。

如何实现?

最佳答案

您需要使用 Lua Script , 以原子方式计算 myStreams 条目的当前数量,然后相应地调用 XTRIM

EVAL "local streamLen = redis.call('XLEN', KEYS[1]) \n if streamLen >= tonumber(ARGV[1]) then \n return redis.call('XTRIM', KEYS[1], 'MAXLEN', streamLen - tonumber(ARGV[1])) \n else return redis.error_reply(KEYS[1]..' has less than '..ARGV[1]..' items') end" 1 myStream 100

让我们看一下Lua脚本:

local streamLen = redis.call('XLEN', KEYS[1])
if streamLen >= tonumber(ARGV[1]) then
return redis.call('XTRIM', KEYS[1], 'MAXLEN', streamLen - tonumber(ARGV[1]))
else
return redis.error_reply(KEYS[1]..' has less than '..ARGV[1]..' items')
end

这会将流的长度获取到 streamLen 中,然后通过计算差异并将其传递给 XTRIM 来删除所需数量的条目。由于 Lua 脚本以原子方式运行,因此不会在 XLENXTRIM 命令之间添加新条目。

Lua 脚本以及 EVAL 命令返回已删除条目的数量,并且它应该与作为参数传递的数字匹配,除非流中的条目较少,在这种情况下它返回(错误)myStream 的项目少于 100 个

如果您想删除最多 n 个条目,如果流中的条目较少则删除较少,对 Lua 脚本做一个简单的更改:

local streamLen = redis.call('XLEN', KEYS[1])
if streamLen >= tonumber(ARGV[1]) then
return redis.call('XTRIM', KEYS[1], 'MAXLEN', streamLen - tonumber(ARGV[1]))
else
return redis.call('XTRIM', KEYS[1], 'MAXLEN', tonumber(ARGV[1]))
end

这两个 Lua 脚本的时间复杂度都是 O(N),其中 N 是逐出条目的数量,因为 XLEN 是 O(1) 而 XTRIM 是 O (N).

关于redis - 如何从 Redis 流中删除或删除给定数量的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com