data-structures - Redis : Pros and Cons for following two approaches

标签 data-structures redis hashmap

我有很多 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: 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 内存效率更高)以及分配给键的值来决定。

请务必查看http://redis.io/topics/memory-optimization

关于data-structures - Redis : Pros and Cons for following two approaches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992830/

相关文章:

php - 可以有效衡量趋势和受欢迎程度的数据库结构?

c - 为什么在将反向排序数组作为输入时出现段错误?

c# - 在 Redis Azure 中存储更大 (2MB) 的对象

python - 同一个 docker-compose 中的 Celery 和 Flask

java - 如何获取用户输入并将其存储到 HashMap 中并分别创建两个键以打印出来?

c - 如何处理索引大于 32 位的数据结构?

c++ - C++类中的ID数据成员

docker - 如何使用Kubernetes statefulset调整Redis配置?

具有多个键的 Java WeakHashMap?

hashmap - 如何在 Rust 中懒惰地创建其构造使用 self 的映射条目