Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures Redis:以下两种方法的优缺点_Data Structures_Redis_Hashmap - Fatal编程技术网

Data structures Redis:以下两种方法的优缺点

Data structures Redis:以下两种方法的优缺点,data-structures,redis,hashmap,Data Structures,Redis,Hashmap,我有很多javascript对象,比如: var obj1 = {"key1" : value1, "key2" : value2, ...} var obj2 = {"key3" : value3, "key4" : value4, ...} 等等 以下是两种方法: 将每个对象存储为Redis哈希,即一对一映射 拥有一个Redis散列(为了更好的性能,可以进行bucketing),将每个对象作为字符串化对象存储在散列的每个键中,即对于Redis散列中具有键值对的每个对象。当我们需要使用对象时

我有很多javascript对象,比如:

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

以下是两种方法:

  • 将每个对象存储为Redis哈希,即一对一映射
  • 拥有一个Redis散列(为了更好的性能,可以进行bucketing),将每个对象作为字符串化对象存储在散列的每个键中,即对于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

    Redis文档还指出,散列是在非常小的空间中编码的,所以您应该尽可能使用散列来表示数据

    因此,在本例中,您可能会继续将它们存储为单独的散列,因为查询特定值会容易得多

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

    Redis非常高效地存储小散列。存储多个小哈希映射比存储一个大哈希映射更节省内存。
    决定要使用的编码的键数可以在redis.conf中找到
    哈希最大zipmap条目512

    此外,每个键的值应为hash max zipmap value 64

    因此,您现在可以根据对象的嵌套、Redis内存效率更高的哈希键数量以及分配给键的值来决定


    你是否需要搜索单个字段,或者你只是在寻找id->文档映射?是的,我也需要搜索单个字段。这些数据将用于前端(我想我应该提到这一点),我使用angular解析字符串化的JSON,因此服务器没有解析任何对象的负载。@AmanGupta即使这样,嵌套对象也最好存储为字符串。否则,您必须查询多个hashmaps才能获得所需的数据。如果没有嵌套对象,请继续并将它们存储为单个散列。如果对象数大于zipmap entries值,您可能还希望将它们存储为单个散列。我没有嵌套对象,因此我们可以解决这个问题。第二种方法也是Instagram使用的,所以我很好奇为什么他们会这样做,他们会有非常充分的理由这样做。嗯。实际上,如果没有嵌套,我看不出为什么要使用第二种方法(如您在问题中提到的)。在存储与内存消耗有关的散列时,Redis文档显然更喜欢第一种方法。虽然性能稍慢一些。