【问题标题】:Is there a difference between an empty key and a key that doesn't exist?空键和不存在的键有区别吗?
【发布时间】:2011-12-25 17:08:18
【问题描述】:

使用 MultigetSliceQuery 时,结果将包含每个键对应的一行,即使该键不存在也是如此。唯一的测试方法可能是检查每一行是否存在任何列。

但是,如果我创建一个包含 1 列或更多列的行,然后删除所有列,则 MultigetSliceQuery 的结果将是相同的(就好像该行一开始就没有创建一样)。

使用 CLI 进行测试时,“list CF”将显示空行键,但“get CF[key]”将返回“Returned 0 个结果。"

没有任何列的行是否有效?

是否应该有一种方法来检查结果是否为空与存在?

【问题讨论】:

    标签: cassandra hector


    【解决方案1】:

    http://wiki.apache.org/cassandra/FAQ#range_ghosts

    如果您执行 MultigetSlice,并枚举键,它将为每个键返回一个结果。

    在 cli 的情况下查看

    http://wiki.apache.org/cassandra/DistributedDeletes

    空行实际上有已删除列的墓碑。

    如果您尝试检索整行并返回没有列的结果,则实际上意味着该行不存在。

    【讨论】:

    • 我认为这与墓碑无关,因为我没有删除键,只是删除了所有列。我正在单个节点上进行测试,GCGraceSeconds=0。但是,归根结底,不存在的行和没有列的行没有区别。
    • 每列都有墓碑,因此您将有一个墓碑来删除每一列。此外,即使 GCGraceSeconds=0,也必须在删除墓碑之前进行压缩。
    • 虽然墓碑可能存在(删除后),但它们对我的行扫描没有影响(在我的问题中)。假设一致性,我发现行扫描将显示所有键,包括已删除的键(直接或通过删除所有列)。我还发现,在删除实际上不存在的行(按键)之后,行扫描现在将列出这些键! (所以那里没有墓碑)。
    • 为了澄清,有每列和每行的墓碑。当您删除一行时(它是否存在并不重要——Cassandra 不会检查它是否存在),会为该行盲目地写入一个墓碑,因此该墓碑将显示在范围扫描中。
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2013-12-22
    • 2015-12-09
    • 2014-09-24
    • 2012-01-25
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多