【问题标题】:Using ReJson to store a numerical tree使用 ReJson 存储数值树
【发布时间】:2018-10-25 14:02:04
【问题描述】:

我想在树中插入固定长度的数值,并在稍后检查它们的存在。大多数数值都是相似的,因此将它们放在SET 中没有意义,因为我会浪费空间。

由于 ReJson PATH 期望键名具有“类似 Java”的命名约定,这就是我想出的:

{
  "_0": {
    "_1": {
      "_2": true
    }
  },
  "_2": {
    "_3": {
      "_4": true
    }
  }
}

所以,当我需要知道是否设置了“012”时,我需要检查"JSON.GET key ._0._1._2" == true是否。

最初,我尝试保存自然树的值,例如:

{
  "0": {
    "1": {
      "2": true
    }
  },
  "2": {
    "3": {
      "4": true
    }
  }
}

但我无法编写任何能够遍历这棵树的PATH,无论是点还是括号形式。

有什么建议吗?我应该坚持我强调的价值观和._a._b._c 模式还是有更好的方法?

【问题讨论】:

  • “遍历”是什么意思?您发布的JSON.GET sn-p 在我的笔记本电脑上工作 :) 另外,您确定要使用 ReJSON 吗?
  • 我进行了一些编辑以提供更清晰的信息,请看一下。我知道我发布的JSON.GET 作品,但我需要使用下划线,因为PATH 需要“类似Java”的命名约定,所以我不能为我发布的第二棵树编写JSON.GET。当然,我愿意接受新的建议 :) ReJson 似乎做了我想要的,一个真正的嵌套树结构。我在这里找到了您对树结构使用 ReJson 的建议:stackoverflow.com/a/50193997/5291611

标签: redis redisjson


【解决方案1】:

ReJSON 使用类似于 JSONPath(但不完全是)的路径。具体来说,docs 声明“名称必须以字母、美元 ($) 或下划线 (_) 字符开头”。这意味着不支持您的第二棵树。

虽然 ReJSON 可用于存储树状结构,但您的用例似乎不会从使用它中受益。相反,我会考虑将树展平并将其存储为哈希(甚至是集合),其中每个字段代表一个路径,例如:

HSET tree 0.1.2 1 2.3.4 1

然后您可以使用HEXISTS 之类的东西来检查“真实性”。

【讨论】:

  • 但是使用哈希存储大量相似的值会占用更多的内存,不是吗?存储像 0123456789、0123456788、0123456787、0123456786 这样的值有一个很长的公共前缀,我会以这种方式插入很多“无用”的数据,而使用树,情况并非如此。我现在意识到我可能已经更好地解释了我的用例:)
  • 我不确定你是否会看到 ReJSON 的改进,尽管它有公共前缀——它有自己的开销。但是,您可以使用 MEMORY USAGE 命令进行测量。
  • 有趣的是,我实际上是在反对使用我写的模块:)
  • 有趣的是,我将使用 ~10M 相似值和 ~2M 非相似值进行一些测试,这两种方法都可以测试内存使用情况。感谢您的提示:)
  • 直接对象属性在哈希中工作,设置也可以,如果不介意插入排序,数组数组也可以工作,但是查找是每个匹配数字的二叉树。此外,如果不确定大小是否比查找时间更重要。哈希键查找通常非常快,除非所有序列都几乎相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2021-01-18
相关资源
最近更新 更多