redis keep expireAt,它会保证过期吗?

时间:2015-11-04 06:52:16

标签: redis

我想使用密钥来限制每秒请求数(RPS),我希望密钥每秒都过期,所以它希望:

if($redis->get($key) > 10){
    // reject
}else{
    $redis->incr($key);
    $redis->expire($key, 1);  // one second later would be a new key
    // accept
}

这会导致问题,因为每个请求都会刷新过期,因此密钥永远不会过期。

因此,如果我将其更改为:

$redis->expireAt($key, time() + 1);  // absolute time, expired at the beginning of next second

我不知道这是否可以解决问题。

关键保证会在那时过期吗?或者如果请求恰好在下一秒开始时发生,它也会刷新吗?

PS:如果在脚本中检查并过期,则使用官方文档,但我只想知道没有脚本的expireAt是否会这样做。 THKS。

修改

我会试着举个例子。

现在是23:50:51,这一秒中的每个请求都会发出到期时间23:50:52,所以如果它是准确的,那么密钥将在那时到期,当时间到了23:50:52,请求会使expireAt 23:50:53,但理论上关键应该只是过期,所以它仍然是一个新的密钥,它可以实现没有多键或脚本的技巧

1 个答案:

答案 0 :(得分:0)

不是仅依赖于expire,而是将时间戳嵌入密钥名称中。

例如,使用key = rl:YYYY:MM:DD:HH:SS代替key = rl可以使密钥过期,但每个新密钥都会创建一个新密钥。此处使用到期时间来保持数据集较小,而不是将增量调用限制为时间窗口。通过使用密钥名称隔离分辨率,可以轻松地将增量调用限制为具有每秒分辨率的时间窗口。