红 :以下两种方法的优缺点



我有很多javascript对象,比如:

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

等等...

以下是两种方法:

  1. 将每个对象存储为 Redis 哈希,即一对一映射。
  2. 有一个 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:JSON.parse 会阻止事件循环吗?

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

最新更新