2013-04-02 64 views
3

有一個有20個域對象的,我有對象A 100萬個實例我如何Redis的哈希性能

我想將它們存儲在Redis的,我必須每天獲取超過100個實例時間。

現在,我有兩個解決方案

  1. 序列化對象A在JSON實例,並將其存儲使用SET key json
  2. 商店每場進一個哈希場,每個實例對應一個哈希表。正如我之前所說的,我必須每次檢索超過100個實例。所以如果我使用redis hash,我必須調用數百個HGETALL key管道,這將非常緩慢。所以我想知道如果我可以通過使用哈希來提高速度?
+0

可能重複[Redis字符串與Redis哈希來表示JSON:效率?](http://stackoverflow.com/questions/16375188/redis-strings-vs-redis-hashes-to-represent-json-efficiency) – DH1TW

回答

1

這將取決於幾件事情:

  1. 多少RAM,提供給您的Redis服務器
  2. 多少對象要存儲
  3. 序列化對象的大小和他們的字段

存儲序列化的對象將佔用更多的空間,因爲您有所有額外的語言特定的信息存儲以及原始數據。如果RAM空間不足或者不得不存儲大量對象,則最好將所有這些數據存儲在散列表中。由於你有100萬行,你可能會通過使用哈希來節省相當多的空間。

我最近遇到了一個非常類似的問題。起初,我嘗試將序列化對象存儲在Redis數據庫中,但我必須存儲超過500萬個對象,並且每個對象都包含大量我不需要存儲在數據庫中的多餘數據。這導致了數據庫大小膨脹並浪費了大量的RAM。

您的需求可能與我的相差很大,所以最好自己進行基準測試。嘗試序列化一個對象,看看結果有多大。將它與鍵的總和大小進行比較,並比較兩者之間的大小差異。如果序列化的對象不是很大,最好只是序列化。記住反序列化不是一個可忽略的操作也是很好的。

0

字符串和哈希是非常不同的數據類型,都有優點和缺點。在你揭露的情況下,你錯過了一些非常重要的事情;例如:

  • 你多久寫一次密鑰?
  • 您是否需要檢索100個項目才能彙總它們?在這種情況下將聚合值存儲爲散列是沒有意義的,因此檢索只能進行一次?
  • 這是一個重寫或重讀應用程序嗎?
  • 你需要寫原子嗎?換句話說,2個併發請求可以在Redis中更新相同的值嗎?如果是這樣,你將如何保證存儲JSON字符串不會導致競爭條件?

僅基於性能進行決策並不是一個好主意,您可能會錯過一些其他重要方面,如完整性,可伸縮性和可維護性。