在Redis中保留空数据密钥

时间:2014-01-22 12:31:06

标签: data-structures redis

Redis可以直接用作键值存储,其值为string。或者,以更复杂的方式,值可以是数据结构,例如散列或列表。假设我们有第二种情况并且在密钥“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”)作为空的非平凡数据结构?

2 个答案:

答案 0 :(得分:8)

简答:否

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

答案 1 :(得分:3)

Manu是对的。你无法做到这一点。

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

你的用例是什么?

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

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