我有很多 JavaScript 对象,例如:
var obj1 = {"key1" : value1, "key2" : value2, ...}
var obj2 = {"key3" : value3, "key4" : value4, ...}
等等...
以下是两种方法:
- 将每个对象存储为 Redis 哈希,即一对一映射。
- 拥有一个Redis哈希(可以进行分桶以获得更好的性能),将每个对象作为字符串化对象存储在哈希的每个键中,即对于每个在Redis哈希中具有键值对的对象。当我们需要使用该对象时,解析该对象。
1) -> 比 2) 占用更多空间,但性能比 2) 更好
2) -> 比 1) 占用更少的空间,但性能比 1) 差
有没有办法确定哪种方法从长远来看更好?
更新:此数据在客户端 (AngularJS) 使用,因此所有字符串化 JSON 的解析都在前端完成。
最佳答案
这可能可以通过决定哪种方法可以最大限度地减少从 Redis 提取所需数据所需的步骤数来解决。
情况 1:大量嵌套对象
如果你的对象有很多嵌套,即对象内对象,就像这样,
obj = {key1:{key2:value1, key:3{key4:value2}}}
您可能应该将它们字符串化并存储。
因为Redis不允许数据结构嵌套。您不能将一个哈希值存储在另一个哈希值中。
并且将 hash2 的名称作为键存储在 hash1 中,并在获取 hash1 后查询 hash2 等等,这不必要地复杂并且有很多查询。在这种情况下,您所要做的就是从 Redis 获取整个字符串并对其进行 JSON.parse。你可以从对象中获取任何你想要的数据。
情况 2:没有嵌套对象。
但另一方面,如果没有对象嵌套并且将其存储为字符串,则每次从 Redis 获取数据时都必须 JSON.parse()
。并且解析 JSON 是阻塞的并且是 CPU 密集型的。 Node.js: does JSON.parse block the event loop?
Redis 文档还指出,哈希值是在非常小的空间中编码的,因此您应该尽可能尝试使用哈希值来表示数据。 http://redis.io/topics/memory-optimization
因此,在这种情况下,您可能可以继续将它们全部存储为单独的哈希值,因为查询特定值会容易得多。
---------更新---------
即使 JSON 解析是在客户端完成的,也尽量不要进行不必要的额外计算:)
但嵌套对象更容易作为字符串存储和查询。否则,您将不得不查询多个哈希表。在这种情况下,存储为字符串化对象可能会更好地提高性能。
Redis 非常高效地存储小型哈希值。以至于存储多个小 HashMap 比存储一个大 HashMap 更具内存效率。
决定使用编码的键的数量可以在 redis.conf 中找到
hash-max-zipmap-entries 512
每个键的值也应该是hash-max-zipmap-value 64
因此,您现在可以根据对象的嵌套、哈希键的数量(低于该数量时 Redis 内存效率更高)以及分配给键的值来决定。
关于data-structures - Redis : Pros and Cons for following two approaches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992830/