【问题标题】:Cassandra: "contains key" operation?Cassandra:“包含密钥”操作?
【发布时间】:2013-03-29 03:33:40
【问题描述】:

有一些 Cassandra 操作来验证列族是否包含键?我们不需要任何行数据,只需要键是否存在。

最好的问候

【问题讨论】:

  • 您要查找具有特定键值的列还是任意列?
  • 在保存用户数据之前,我们要检查这个用户是否存在。

标签: cassandra


【解决方案1】:

如果您使用的是 Java,则为 rowKey 创建一个 SliceQuery,并将开始/结束值设置为等于您要查找的特定列键。如果有一列具有特定键,则以下表达式为真:

sliceQuery.execute().get().getColumns().size() > 0

【讨论】:

  • 考虑到 Theo 的建议,它可能很昂贵。我们正在寻找的是一些更接近 O(1) 成本的操作,比如打哈欠的查找。我将编辑我的帖子以使其更加清晰。
  • 一行的列按排序顺序存储在一起,可以非常快速地检索切片。我认为这是一个相当快的操作。平均一行有多少列?
  • 我们将尝试一些测试并评估此解决方案。也许,辅助列族有助于改进这种查找,此外它可能会导致一些不一致。
  • 您可以通过限制为 1 列返回来使其成为 O(1)。在 Hector 中,您可以通过在 SliceQuery.setRange 中设置 count 参数来做到这一点。
【解决方案2】:

一种快速的方法是询问该行的列数,如果它是肯定的,则该行存在。由于墓碑,“不存在”周围有一个灰色区域。您可以删除一行的所有列,但请求该行的数据可能会导致一组空的列而不是null(这在很大程度上取决于您使用的驱动程序)。您应该将没有列的行视为不存在,因此询问列数可能是确定行是否存在的最佳方法。

Cassandra FAQ under "range ghosts" 中有更多相关信息。

【讨论】:

  • 请记住,'count' 将读取所有列。因此,如果您有一个非常大的行,当您只想知道它是否遇到任何活动列时,这可能需要很长时间。
  • 是的,这对于宽行列族是不可取的。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2021-12-26
  • 2012-02-18
  • 2018-04-13
  • 2018-09-05
  • 2021-06-23
  • 2018-02-10
相关资源
最近更新 更多