我有很多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非常有效地存储小哈希。如此之多以至于存储多个小哈希图比一个大哈希图具有更高的内存效率。
    可以在redis.conf中找到决定要使用的编码的键数hash-max-zipmap-entries 512每个键的值也应该是hash-max-zipmap-value 64因此,您现在可以基于对象的嵌套,散列键的数量(低于此值,Redis会更有效地利用内存)以及分配给键的值来决定。

    一定要通过http://redis.io/topics/memory-optimization

    10-02 02:03
    查看更多