2014-01-22 116 views
4

Redis可以直接用作鍵值存儲,其值爲字符串。或者,以更復雜的方式,該值可以是數據結構,例如散列或列表。假設我們有第二種情況,並且在關鍵字「H」下面,有一個散列。項目可以添加到散列並刪除。最終,散列可以是空的,並且可以再次重新填充。保留Redis中的空數據密鑰

我發現如果我們從數據結構中刪除最後一項,我們的散列「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」的值(空哈希,在我們的例子),在我們的例如)作爲一個空的非平凡的數據結構?

回答

7

簡短的回答:沒有

Redis的「創建哈希的第一個項目時,插入和「刪除哈希」當最後一個項目被刪除。我使用的是Redis 2.8,沒有選擇「讓空的散列成爲」。

2

Manu是對的。你沒有辦法做到這一點。

但是,如果你解釋爲什麼你想這樣做,那麼我們可能會幫助你更好。如您所知,在Redis中,您可以在哈希上設置一個屬性,即使它之前不存在,也不需要先創建哈希,然後設置屬性。考慮到這一點,沒有必要保留一個空的哈希,這隻會浪費記憶。

你的用例是什麼?

更新:閱讀您的使用案例後,我正在改進答案。

對於「volatile」散列的問題,你可以做一些簡單的事情。在運行KEYS(或SCAN)命令後,可以創建一個包含此迭代中存在的所有散列名稱的SET。你可以稱之爲「last_seen_keys」。你現在想要做的是,在你調用KEYS之後,你創建一個你稱之爲「current_keys」的集合。現在你只需在兩組之間運行一個差異,這樣你就可以看到哪些按鍵出現在最後一遍而不是這一次。您可以將statsd中的值設置爲零。之後,刪除「last_seen_keys」SET,並將「current_keys」SET重命名爲「last_seen_keys」。這應該會訣竅

+0

我想要的是在Redis中監視各種哈希的長度。我正在使用statsd,但沒關係。重點是,每分鐘,我將所有_existing_ Redis結構(哈希)的長度轉儲到statsd。哈希的名稱是動態的,這就是爲什麼我不能列舉它們。我需要運行「KEYS Hash- *」然後遍歷這些。但是,如果散列消失了,我在statsd中有最後一個非零值,但應該用零代替 - 顯然,空散列的長度爲零。 –

+0

沒有直接執行此操作的命令,但可以執行某些操作。首先,停止使用KEYS,因爲它非常低效。從redis 2.8開始,您可以使用SCAN,它更加高效,專門爲需要處理動態密鑰的用戶設計。 –

+0

我剛剛改進了我的答案,包括我提出的解決方案 –