Redis: 在哈希上实现过期

创建于 2011-10-28  ·  44评论  ·  资料来源: redis/redis

您好,我想知道是否可以在散列键上设置过期时间?
例如,我希望在散列中包含已连接成员的列表,每个键的过期时间为 5 分钟。

是否可以?

谢谢,并提前为我的英语感到抱歉。

问候, 马克斯

最有用的评论

好吧,我几乎从不想一次使整个哈希过期。 所以实际上,您建议将散列分解为一堆键。 那行得通,但同样的论点可以用来问你为什么需要散列? 将所有逻辑相关的键组合在一起具有巨大的价值。 否则,您需要通过一些存储您的密钥的集合来进行记账,并且您会遇到参照完整性问题。 这一切都是可行的,但感觉在 redis 中不支持使散列中的单个键过期,这感觉像是一个很大的遗漏。 而且我不相信让 N 个不同的人以 M 种不同的方式解决它有任何价值。

所有44条评论

嗨,这是不可能的,要么为该特定字段使用不同的顶级键,要么与提交的另一个字段一起存储具有过期时间的字段,获取两者,并让应用程序了解它是否仍然有效基于当前时间。

redis 127.0.0.1:6379> hset expire:me name tom
(整数)0
redis 127.0.0.1:6379> hget expire:me name
“汤姆”

redis 127.0.0.1:6379> 过期过期:我 10
(整数)1
redis 127.0.0.1:6379> ttl过期:我
(整数) 8

...
...
...

redis 127.0.0.1:6379> ttl 过期:我
(整数)-1
redis 127.0.0.1:6379> hget expire:me name
(零)

所以它有效

我相信请求是使单个字段过期。 使整个散列过期与使任何其他键过期相同。

是的,我也满足了这个要求。 是否可以使单个字段过期?

创建具有不同到期时间的多个散列是否存在特定问题?

好吧,我几乎从不想一次使整个哈希过期。 所以实际上,您建议将散列分解为一堆键。 那行得通,但同样的论点可以用来问你为什么需要散列? 将所有逻辑相关的键组合在一起具有巨大的价值。 否则,您需要通过一些存储您的密钥的集合来进行记账,并且您会遇到参照完整性问题。 这一切都是可行的,但感觉在 redis 中不支持使散列中的单个键过期,这感觉像是一个很大的遗漏。 而且我不相信让 N 个不同的人以 M 种不同的方式解决它有任何价值。

感谢 Kevin Menard 和 Johan Bergström。 实际上我遇到了这里描述的相同场景
如果我将所有字段拆分为这样的键: hashkey:field1 , hashkey:field2 ,.. 很难将这些键作为集合进行管理。 比如查询所有字段,需要KEYS 'patten'...

问候,
邓春平

这是非常有问题的。 我想让散列中的特定键过期的原因是因为我将缓存设置存储在散列中。 我想在设置密钥后自动使它们过期。 同时,如果我的所有设置都已更新,我需要能够终止整个哈希。 所以我需要能够在列表中获取这些设置,并删除列表。 没有找到所有设置实例

bjoshuanoah 有同样的问题,现在,我使用带有 ttl 而不是哈希的密钥,例如:
哈希:哈希名 A - 键 B - 值 C
键值:键 A_B - 值 C

缺乏此功能在技术上是不可能的还是设计的选择?

设计的选择导致不允许实现的实现。

:+1:

redis本身不支持,这个功能太有用了。

直到今天 redis 才打算实现这个功能:-(

redis 127.0.0.1:6379> hset expire:me name tom
(整数)0
redis 127.0.0.1:6379> hget expire:me name
“汤姆”

redis 127.0.0.1:6379> 过期过期:我 10
(整数)1
redis 127.0.0.1:6379> ttl过期:我
(整数) 8

...
...
...

redis 127.0.0.1:6379> ttl 过期:我
(整数)-1
redis 127.0.0.1:6379> hget expire:me name
(零)

所以它有效

哈希表中只有一个字段,那么多个字段呢? 它不会正常工作!

@oylz - 我相信此功能请求的初衷是允许哈希中的特定字段而不是整个密钥到期。

@itamarhaber
怎么会这样?:
hset expire:me name1 tom1
hset expire:me name2 tom2
hset expire:me name3 tom3

ttl过期:我10

整个哈希表(expire:me) 将过期。

@oylz我们知道完整的哈希将过期。 它可以工作,但在这里我们谈论的是任何散列的单个字段(正如@itamarhaber已经解释过的那样)。 例如,在您的情况下,如何在 5 秒后使 name1 字段过期,在 10 秒后使 name2 过期,在 15 秒后使 name 3 过期? 我希望现在很清楚这里正在讨论什么用例。

@nomi-ramzan
你真的懂吗? 正如@itamarhaber所说:“我相信此功能请求的初衷是允许哈希中的特定字段不是整个 key到期。”

@nomi-ramzan
对不起,我一开始就回复错了,我应该回复@wheelq
例如:
_redis 127.0.0.1:6379> hset expire:me name tom
(整数)0
redis 127.0.0.1:6379> hget expire:me name
“汤姆”

redis 127.0.0.1:6379> 过期过期:我 10
(整数)1
redis 127.0.0.1:6379> ttl过期:我
(整数) 8

...
...
...

redis 127.0.0.1:6379> ttl 过期:我
(整数)-1
redis 127.0.0.1:6379> hget expire:me name
(零)

所以它有效_

这是 2020 年,Redis 应该关注这个

我公司已实现过期哈希字段功能
它基于 redis 4.0

本地提供此功能将非常有帮助。
谢谢。

我还在等这个

逆天! Redis 还没有实现它!

在这里也是一样,能够将过期设置为哈希字段会很棒

+1

逆天! Redis 还没有实现它!

+1 此功能

发现 Redis 世界后,我想象以这种形式存储缓存:
1)每个哈希表 - 是我的api方法
2)哈希表中的行——方法输入参数的哈希函数,值为方法的响应

+1 此功能

+1 此功能

+1

+1

+1

+1

是否有特定原因未实现散列中的过期键?

尚未实现此功能的原因是此功能所需的时间 (CPU) 和空间 (RAM) 的复杂性增加。 也就是说,永远不要说永远。

时间复杂度是多项式时间的顺序吗? 是什么使它成为 RAM 密集型的,出于任何目的进行克隆?

我敢肯定,如果实现此功能,redis 的受欢迎程度将大大提高

+1 此功能

+1

+1

此页面是否有帮助?
0 / 5 - 0 等级