gpt4 book ai didi

redis - redis中调用expire或pexpire时,时间是否向上取整?

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

我调用 expire对于现有的 redis key 。假设我传递了 5 的值。如果 key 已经存在并且距离到期还有 4.75 秒,它是保持在 4.75 秒还是四舍五入到 5 秒?

我可以使用 pexpire为了获得更多的粒度,但仍然存在部分毫秒的舍入问题 - 除非毫秒是 redis 中的最小粒度...

如果有帮助,这是我的速率限制脚本,它需要一个键、一个递增量和一个毫秒速率限制窗口,它会一直递减直到键退出,此时下一次调用会添加键并设置一个新的过期时间时间。然后返回新的递增值。

local f,k,a,b,c c=ARGV[2] f=redis.call k=KEYS[1] a=f('incrby',k,ARGV[1]) b=f('pttl',k) f('pexpire',k,math.min(b<0 and c or b,c)) return a

更新
没有部分时间问题的新速率限制脚本,如果 key 根本没有设置过期,它只会设置过期:
local f,k,a,b f=redis.call k=KEYS[1] a=f('incrby',k,ARGV[1]) b=f('pttl',k) if b<0 then f('pexpire',k,ARGV[2]) end return a

最佳答案

Does it stay at 4.75 seconds or is it rounded back up to 5 seconds?



它又回到了完整的 5 秒 TTL。

unless milliseconds is the smallest granularity in redis...



它是毫秒,对于 2.6 或更高版本

Expire accuracy

In Redis 2.4 the expire might not be pin-point accurate, and it could be between zero to one seconds out. Since Redis 2.6 the expire error is from 0 to 1 milliseconds.





Keys expiring information is stored as absolute Unix timestamps (in milliseconds in case of Redis version 2.6 or greater).



如果你想验证,你可以玩一些 Lua 脚本
EVAL "local result = {'Time at start', 0, 'Expires in (ms)', 0, 'Time at end', 0} \n result[2] = redis.call('TIME') \n redis.call('EXPIRE', KEYS[1], ARGV[1]) \n result[4] = redis.call('PTTL', KEYS[1]) \n result[6] = redis.call('TIME') \n return result" 1 myKey 5

脚本的友好 View :
local result = {'Time at start', 0, 'Expires in (ms)', 0, 'Time at end', 0}
result[2] = redis.call('TIME')
redis.call('EXPIRE', KEYS[1], ARGV[1])
result[4] = redis.call('PTTL', KEYS[1])
result[6] = redis.call('TIME')
return result

关于redis - redis中调用expire或pexpire时,时间是否向上取整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59549413/

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