【问题标题】:cassandra and row cache updatecassandra 和行缓存更新
【发布时间】:2017-07-17 04:07:17
【问题描述】:

Cassandra 具有行缓存以提高读取性能。我有一个用例,其中一个表有 20 个字段,其中只有 2 个字段(f1 和 f2)对于任何给定的行更频繁地更新/更改,而其他字段是相当静态的。

如果行缓存最初包含特定主键 K1 的行值(整行),则读取该行(整行)会很快。稍后如果我更新此行的 f1 和 f2 字段(假设 f1 和 f2 新值在 memtable 中 - 在内存中)然后

1) 读取这一行(整行)的速度是否同样快,即是否会有任何磁盘访问?

2) 只读取该行的 f1 和 f2 字段(值在 memtable 中)会很快吗?

3) 仅读取该行的其他值(f1 和 f2 除外 - 长时间未更改/更改/更新且位于行缓存中)会很快吗?

【问题讨论】:

    标签: caching cassandra row


    【解决方案1】:

    如果对某行进行写入,则该行的行缓存将失效,并且在读取之前不会再次缓存。

    Cassandra 读取路径:

    1. 如果该行在行缓存中,则返回数据
    2. 否则检查布隆过滤器。如果布隆过滤器指示该行在 SSTables 中不存在,那么我们不必读取 SSTables,只从 MemTable 中读取。
    3. 否则读取 MemTable 并读取每个必须读取的 SSTable 并与 MemTable 中的数据合并
    4. 使用合并的数据更新行缓存。
    5. 合并后的数据返回

    因此,在您的情况下,键 K1 的第一整行位于行缓存中。然后您更新了f1 和f2,因此整个行从行缓存中失效。

    1. 如果您读取整行,行缓存未命中和数据将从 MemTable 或从 MemTable 和 SSTables 中读取。所以会很慢

    2. 如果您读取 f1 和 f2,则行缓存未命中,如果数据不在 SSTables 中,则仅从 MemTable 读取(快速),否则从 MemTable 和 SSTables 读取(慢速)。

    3. 除 f1 和 f2 之外的读取字段必须位于 SSTables 中,以便从 SSTables 和 MemTable 中读取数据。所以会很慢

    【讨论】:

    • 感谢您的快速回复。在上面的情况(1)中,不是效率低下。 Cassandra 可以只将行的 2 个字段标记为无效,当它必须返回一行时,它可以从 memtable 中获取 2 个更改的字段,更新行缓存并返回行(将很快) - cassandra 是否有任何计划进行此优化.快速意味着什么 - 是几微秒吗?慢意味着 - 8ms 到 40ms?
    • cassandra 的正常读取延迟可以是亚毫秒,只要您有合理调整的堆和小(高效)分区大小。
    猜你喜欢
    • 2017-01-29
    • 2018-02-14
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2013-05-02
    • 2015-08-30
    相关资源
    最近更新 更多