Redis:遵循两种方法的优点和缺点

时间:2016-03-14 16:23:55

标签: data-structures redis hashmap

我有很多javascript对象,如:

var obj1 = {"key1" : value1, "key2" : value2, ...}
var obj2 = {"key3" : value3, "key4" : value4, ...}

依旧......

以下是两种方法:

  1. 将每个对象存储为Redis Hash,即一对一映射。
  2. 有一个Redis Hash(可以为了更好的性能而进行分段),将每个对象作为字符串化对象存储在每个哈希键中,即对于Redis哈希中具有键值对的每个对象。当我们需要使用该对象时解析对象。
  3. 1) - >占用大量空间而不是2)但是比2)具有更好的性能

    2) - >占用的空间少于1)但性能低于1)

    有没有办法确定哪种方法从长远来看会更好?

    更新:此数据由客户端(AngularJS)使用,因此所有对字符串化JSON的解析都在前端完成。

1 个答案:

答案 0 :(得分:3)

这可能通过决定哪种方法最小化从redis中提取所需数据所需的步骤数来解决。

案例1:许多嵌套对象
如果您的对象有很多嵌套,即对象内的对象,如此,
   obj = {key1:{key2:value1, key:3{key4:value2}}}

你应该对它们进行字符串化和存储 因为Redis不允许嵌套数据结构。您不能在另一个哈希中存储哈希。 并且将hash2的名称存储为hash1中的键并在获取hash1之后查询hash2等等,这是不必要的复杂并且有很多查询。在这种情况下,您所要做的就是从Redis和JSON.parse获取整个字符串。你可以从Object获得你想要的任何数据。

案例2:没有嵌套对象 但另一方面,如果没有对象嵌套并将其存储为字符串,则每次从Redis获取数据时都必须JSON.parse()。并且解析JSON是阻塞的并且是CPU密集型的。 Node.js: does JSON.parse block the event loop?

Redis文档还说哈希是在非常小的空间中编码的,因此您应该尝试每次使用哈希值来表示数据。 http://redis.io/topics/memory-optimization

因此,在这种情况下,您可以继续将它们全部存储为单独的哈希值,因为查询特定值会更容易。

--------- ---------更新
即使在客户端上完成JSON解析,也不要不必要地进行额外的计算:) 但是嵌套对象更容易以字符串形式存储和查询。否则,您将不得不查询多个哈希表。在这种情况下,存储为字符串化对象可能只是更好的性能。

Redis非常有效地存储小哈希。存储多个小型哈希映射比一个大型哈希映射更具内存效率 可以在redis.conf中找到决定要使用的编码的键数 hash-max-zipmap-entries 512
每个键的值也应为hash-max-zipmap-value 64
因此,您现在可以根据对象的嵌套,Redis更高内存效率的哈希键的数量以及分配给键的值来决定。

请完成http://redis.io/topics/memory-optimization