2014-10-29 82 views
0

請幫忙選擇如何存儲信息:哈希需要比列表更多的內存?

1)

SET msg:1 sender 12 
SET msg:1 text "hello there" 
SET msg:1 date 6278127367 
SET msg:1 recpnt 88223 
SET msg:1 viewed false 
SET msg:2 sender 102 
SET msg:2 text "blablabla" 
SET msg:2 date 6278127643 
SET msg:2 recpnt 523 
SET msg:2 viewed false 
SET msg:3 sender 16 
SET msg:3 text "nice weather isntit" 
SET msg:3 date 6278127432 
SET msg:3 recpnt 48781 
SET msg:3 viewed true 

2)

LPUSH msg:1 12 "hello there" 6278127367 88234 false 
LPUSH msg:2 523 "blablabla" 6278127367 4323 false 
LPUSH msg:3 16 "nice weather isn't it" 6278127234 223 true 
LPUSH fields sender text date recpnt viewed 

SET似乎更容易比列表中使用,但將Redis的存儲字段名稱與每個消息並因此大約的內存使用情況?

回答

1

首先,我相信你的意思是說散列,而不是設置;設置的數據結構並不適合您所描述的內容。

兩個選項,那麼你必須是:

  1. 散列:字符串到字符串的地圖數據。如果你想象的鍵值是JSON數據,你作爲一個散列消息將是這個樣子:

    msg:1 = { 
        "sender": "12", 
        "text": "hello there", 
        "date": "6278127367", 
        "recpnt": "88223", 
        "viewed": "false" 
    } 
    

    你會發現,你可以清楚地看到什麼樣的價值的地圖,哪個鍵;數據有一些結構。 Hash look up也是恆定時間。

  2. 列表:字符串的鏈接列表。再次,想象您的數據爲JSON:

    msg:1 = ["12", "hello there", "6278127367", "88223", "false"] 
    

    現在不清楚什麼值映射到什麼字段,是嗎?您將不得不跟蹤列表的哪個索引存儲哪些信息,這會增加應用程序的複雜性。另外,accessing an individual field不再是恆定時間。

從以上兩點,哈希似乎更合適。

但選擇散列表對空間有什麼影響?這裏是散列和列表兩者的使用上述消息(使用DEBUG OBJECT <key>找到)的大小:

  • 列表:49個字節
  • 哈希:86個字節(〜1.75倍)

該消息只有11個字符。那麼tweet-sized (116 characters)呢?

  • 清單:143個字節
  • 哈希:174個字節(〜1.22x)

是,哈希將是更大的存儲,但它可能不會是雙大小你的平均情況。因此,儘管有點大,我仍然認爲散列是正確的數據結構使用(除非,當然,你增加的託管賬單將破產你)。

+0

確切地說,但我最關心的是內存佔用,因爲數據翻倍意味着雙RAM意味着雙重成本($$)的託管。 – exebook 2014-10-29 14:28:19

+1

也許短的屬性名稱是節省內存的方式。 – exebook 2014-10-29 16:04:54

相關問題