【问题标题】:Keep empty data-keys in Redis在 Redis 中保留空的数据键
【发布时间】:2014-01-22 12:31:05
【问题描述】:

Redis 可以直接用作键值存储,其中值是字符串。或者,以更复杂的方式,该值可以是数据结构,例如散列或列表。假设我们有第二种情况并且在键“H”下,有一个散列。可以将项目添加到散列中并删除。最终,哈希可以为空,并且可以再次重新填充。

我发现如果我们从数据结构中删除最后一项,我们的哈希“H”,Redis 会出于某种原因从当前键中删除它。

例子:

HSET "H" "key1" "value1"
HSET "H" "key2" "value2"
HDEL "H" "key1"
 <-- Here, "H" is in the list of current keys, whereby HLEN returns 1
HDEL "H" "key2"
 <-- Here, for some reason, "H" is not shown among existing keys, 
     not even as an empty hash (HLEN 0)
HSET "H" "key3" "value3"
 <-- Hash is back in the list of keys

我的问题是:是否可以配置 Redis,使其仍将给定键(在我们的示例中为“H”)的值(在我们的示例中为空哈希)显示为空的非平凡数据结构?

【问题讨论】:

    标签: data-structures redis


    【解决方案1】:

    简短回答:否

    Redis 在插入第一项时“创建哈希”,在删除最后一项时“删除哈希”。我正在使用 Redis 2.8,并且没有“让空哈希成为”的选项。

    附录:Redis 6 也是如此。

    【讨论】:

    【解决方案2】:

    马努是对的。你没有办法这样做。

    但是,如果您解释了为什么要这样做,那么我们可能会为您提供更好的帮助。如您所知,在 Redis 中,您可以在 Hash 上设置属性,即使它以前不存在,因此您不需要先创建 Hash,然后再设置属性。考虑到这一点,没有必要保留一个只会浪费内存的空 Hash。

    你的用例是什么?

    更新:阅读您的用例后,我正在改进答案。

    对于您的“易失”哈希问题,您可以做一些简单的事情。运行 KEYS(或 SCAN)命令后,您可以创建一个包含此迭代中存在的所有哈希名称的 SET。您可以将其称为“last_seen_keys”。您现在要做的是,在调用 KEYS 之后,创建一个称为“current_keys”的集合。现在您只需在两组之间运行一个差异,这样您就可以看到哪些键出现在最后一次传递中,而不是在这次传递中。对于这些键,您可以将 statsd 中的值设置为零。之后,删除“last_seen_keys”SET 并将“current_keys”SET 重命名为“last_seen_keys”。这应该可以解决问题

    【讨论】:

    • 我想要的是监控 Redis 中各种哈希的长度。我正在使用 statsd,但这没关系。关键是每分钟,我将所有现有 Redis 结构(散列)的长度转储到statsd。哈希的名称是动态的,这就是为什么我不能只列举它们。我需要运行“KEYS hash-*”然后遍历这些。但是,如果散列消失了,我在 statsd 中有最后一个非零值,但应该被零替换 - 显然,空散列的长度为零。
    • 没有命令可以直接执行此操作,但您可以执行某些操作。首先,停止使用 KEYS,因为它非常低效。从 redis 2.8 开始你可以使用 SCAN,它更高效,专为需要处理动态键的用户设计。
    • 我刚刚改进了答案以包含我提出的解决方案
    • 谢谢你,拉米雷斯。虽然我知道 KEYS 的效率低下,但当只有几十个而不是更多时,这没什么大不了的。并且您使用 last_seen_keys 的解决方案可能会起作用,但这正是我不想做的那种矫枉过正...我也可以破解 statsd 以类似的方式处理数据,但我想要“最干净”的解决方案。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多