Redisstring与Redis哈希代表JSON:效率?

我想将一个JSON负载存储到redis中。 有两种方法可以做到这一点:

  1. 一个使用简单的string键和值。
    key:user,value:payload(整个JSON blob可以是100-200 KB)

    SET user:1 payload

  2. 使用散列

    HSET user:1 username "someone"
    HSET user:1 location "NY"
    HSET user:1 bio "STRING WITH OVER 100 lines"

请记住,如果我使用散列,值长度是不可预测的。 它们并不全都如上面的生物实例那样。

哪个更有记忆效率? 使用string键和值,或使用散列?

这取决于你如何访问数据:

去select1:

  • 如果您在大部分访问中使用大部分字段。
  • 如果可能的键有差异

去select2:

  • 如果您在大部分访问中只使用单个字段。
  • 如果你总是知道哪些字段可用

PS:作为一个大拇指的规则,去为大多数你的用例需要更less的查询选项。

本文可以提供很多见解: http : //redis.io/topics/memory-optimization

在Redis中存储对象数组的方法有很多种( 扰stream器 :对于大多数用例,我喜欢选项1):

  1. 将整个对象作为JSON编码的string存储在单个键中,并使用set(或list,如果更合适的话)跟踪所有对象。 例如:

     INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id} 

    一般来说,这可能是大多数情况下最好的方法。 如果对象中有很多字段,则对象不会与其他对象嵌套,而且您一次只能访问一小部分字段,最好使用选项2。

    优点 :被认为是一个“良好的做法”。 每个对象都是一个完整的Redis键。 JSONparsing速度很快,尤其是当您需要一次访问此对象的许多字段时。 缺点 :只需要访问单个字段时速度较慢。

  2. 将每个对象的属性存储在Redis哈希中。

     INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id} 

    优点 :被认为是一个“良好的做法”。 每个对象都是一个完整的Redis键。 不需要parsingJSONstring。 缺点 :当您需要访问对象中的所有/大部分字段时可能会比较慢。 而且,嵌套的对象(对象内的对象)不能被容易地存储。

  3. 将每个Object存储为Redis哈希中的JSONstring。

     INCR id:users HMSET users {id} '{"name":"Fred","age":25}' 

    这可以让你巩固一点,只使用两个键而不是许多键。 明显的缺点是你不能在每个用户对象上设置TTL(和其他东西),因为它只是Redis哈希中的一个字段,而不是一个完整的Redis关键字。

    优点 :JSONparsing速度很快,尤其是当您需要一次访问该对象的许多字段时。 减less主键名称空间的“污染”。 缺点 :当你有很多的对象时,大概和#1有相同的内存使用率。 当您只需要访问单个字段时,会比#2慢。 可能不被认为是一个“良好的做法”。

  4. 将每个对象的每个属性存储在专用密钥中。

     INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id} 

    根据上面的文章,这个选项几乎不可取的 (除非对象的属性需要具有特定的TTL或其他东西)。

    优点 :对象属性是全面的Redis键,这可能不会为你的应用程序矫枉过正。 缺点 :速度慢,需要更多的记忆,而不被认为是“最佳实践”。 大量的主键名字空间污染。

整体总结

选项4通常不是优选的。 选项1和2非常相似,而且都很常见。 我更喜欢选项1(一般来说),因为它允许您存储更复杂的对象(具有多层嵌套等)。当您真正关心不污染主键名称空间时使用选项3(即,您不想要在你的数据库中有很多密钥,你不关心TTL,密钥分片等等)。

如果我在这里出了问题,请考虑留言,让我在投票前修改答案。 谢谢! 🙂