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”)作为空的非平凡数据结构?
答案 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”。那应该是诀窍