Redis多集合带有TTL

55

在Redis中,有一个SETEX命令允许我设置一个具有过期时间的键,是否存在一个多值设置版本的该命令并且也有TTL选项?

MSETMSETNX命令都没有这样的选项。


29
我的意思是...人们会想知道为什么这在2018年仍然不存在。 - cen
8
又过了一年,仍然在思考2019年 :( - Abhinav Rai
17
在2020年也是如此。 - timofey
8
2021年已经进入三月,向你问好。 - Pangamma
8
2022年这个问题仍然很重要。 - Nairum
显示剩余5条评论
5个回答

19

我也在寻找这种操作,没有找到任何东西,所以我用MULTI/EXEC实现了它:

MULTI
expire key1
expire key2
expire key3
EXEC

1
这也是我最终做的事情。 - Ian
可能会非常缓慢,如何在Java上执行? - yanghaogn

8

这个问题可以追溯到2012年的一个问题。对于那些想知道为什么没有实现它的人来说,很遗憾,我们不会添加更多可以处理多个键的命令,因为它们本质上很难分发。相反,明确调用每个要过期的键的 EXPIRE 命令更容易分发(如果需要,您可以将每个命令路由到不同的服务器)。如果您想原子地 EXPIRE 键,可以在 MULTI/EXEC 块中包装多个调用。


顺便说一下,如果不需要事务,请尝试使用管道代替 MULTI/EXEC 以获得更好的性能

管道不仅是减少往返时间相关的延迟成本的一种方式,它实际上大大提高了在给定 Redis 服务器上可以执行的操作数量。


1
截至2022年8月,根据此处的评论,这个操作是不可能的,也许永远都不会实现。 我已经找到了一个很好的解决方案(在我看来),它是我找到的最快的解决方案。 我的解决方案是使用hmset存储键,然后在哈希键上使用expire。 这将为哈希设置ttl,因此也为其中所有键设置ttl。
这个解决方案并不完美!但考虑到其他解决方案和mset的选项缺乏,这是一个可靠的解决方案,帮助我解决了这个问题。

0
EVAL "<multi_ttl_script>" N key1 key2 ... value1 ttl1 value2 ttl2 ...

0

很遗憾我们不能使用mset设置过期时间,以下是一个解决方案,适用于使用nodejs和redis库的人:

// expires the key at next mid-night
let now = moment()
let endOfDay = moment().endOf('day')
let timeToLiveInSeconds = endOfDay.diff(now, 'seconds')

redisClient.expire(keyName, timeToLiveInSeconds)

我希望它有所帮助

1
这是一个关于Redis的问题,而不是关于Node的问题。我认为几乎每个来到这个页面的人都知道EXPIRE命令的存在:https://redis.io/commands/expire - kylebebak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接