我有很多javascript对象,如:
var obj1 = {"key1" : value1, "key2" : value2, ...}
var obj2 = {"key3" : value3, "key4" : value4, ...}
依旧......
以下是两种方法:
1) - >占用大量空间而不是2)但是比2)具有更好的性能
2) - >占用的空间少于1)但性能低于1)
有没有办法确定哪种方法从长远来看会更好?
更新:此数据由客户端(AngularJS)使用,因此所有对字符串化JSON的解析都在前端完成。
答案 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更高内存效率的哈希键的数量以及分配给键的值来决定。