使用 Redis BITFIELD 作为具有特定边界的计数器

问题描述 投票:0回答:1

我试图通过定义其最低和最高界限来使用 BITFIELD 作为我的速率限制器应用程序中的计数器,但不确定如何实现它。我真正需要的是,计数器从 0 开始,最多可以达到 30(或者我将来需要的任何其他数字,例如 10,000)。

下面的数字上升到 15,然后用

null
进行响应。不确定如何指定这些限制。

BITFIELD k-19 OVERFLOW FAIL INCRBY u4 1 1

注意:我可以使用 Lua 脚本来实现此目的,但我不确定它是否会导致性能问题。

local key = KEYS[1]
local inc = ARGV[1]
local max = tonumber(ARGV[2])

local val = redis.call("GET", key) or 0

val = val + inc
if (val >= 0 and val < max) then
    redis.call("SET", key, val)

    return val
end

return max
redis
1个回答
0
投票

我认为你不能做得比这更好。当然,除非您可以将

max
从 30 更改为 31(或任何其他 2^n-1,其中 n 是整数值)。如果是这样,您可以简单地分配 n 位并将
OVERFLOW
设置为
SAT

关于您的代码的一个注释:

val = val + inc
可能对积分精度的丢失很敏感,但如果您控制这些值,这不是一个真正的问题。

© www.soinside.com 2019 - 2024. All rights reserved.