2013-05-13 167 views
1

我有一個二維數組存儲在redis中,我看到兩種解決方案:將其存儲爲JSON字符串或每行存儲一個哈希。哪種方法更好?在redis中存儲二維數組

+0

你可以管理你的redis讀/寫嗎?這似乎是基準測試的合適情況。 – sberry 2013-05-13 16:41:59

+0

是的,我可以管道讀/寫 – 2013-05-13 16:51:37

+0

「更好」取決於你的形象模式。一次讀取或更新一行或一列是否有意義?你會一直保存/閱讀整個表嗎?你正在優化傳輸速度嗎?序列化速度?存儲大小? – Triptych 2013-05-13 17:27:25

回答

3

在設計應用程序時,我遇到了同樣的問題。我選擇了簡單的一面。我將假設你的2d數據數組表示一個數據庫行。我會JSON編碼並使用SET進行存儲。這允許我在使用一個redis命令處理多個對象時使用MGETMSET。如果這個數據在我的數據庫中得到更新,我的密鑰是DEL。對我來說,這比嘗試更新redis散列更容易。

redis中的哈希值有其優點。由於redis使用「ziplist」編碼,它們通常會佔用較少的內存。您也可以避免序列化,這對於某些應用程序可能非常重要。

下面是一個用於我的散列的示例用例。假設我想要查看給定用戶名的用戶名。我會做HGET user.usernames 1234。這會給我用戶名爲1234的用戶名。如果沒有,我會查詢數據庫並設置它,並且因爲數據永遠不會改變,所以我永遠不會過期哈希。它允許快速查找常見的數據,而不是拉動整個用戶,反序列化並返回所需的字段。

對於一個預期的大量查找表,我使用這裏提出的算法:http://redis.io/topics/memory-optimization 它使用多個散列,好像有一個哈希,並利用ziplist編碼來節省內存。

無論您選擇哪種方法,只需保持一致。

+0

感謝您使用redis文檔的鏈接,它讓我意識到我可以使用'SETRANGE'和'GETRANGE'命令來執行我需要的功能。我需要存儲的2D數組僅包含0到9之間的數字,因此我可以存儲唯一的字符串,並將我的數組的行連接起來。這種方法非常快。 – 2013-05-16 07:55:03

1

如何使用Redis lists?不支持列表列表,但可以爲每個列表條目存儲一行,或者構建引用其他列表的鍵列表。

1

您可以將每個元素存儲在自己的鍵中。只需要命名鍵名,以便名稱包含元素的索引,也可以是數組的維數。