gpt4 book ai didi

cassandra - Memtable 和 key 缓存混淆

转载 作者:行者123 更新时间:2023-12-03 06:57:00 24 4
gpt4 key购买 nike

我正在使用 Hector 和默认 Cassandra 缓存设置从 CF 读取行。这意味着 key 缓存已打开。我正在使用 jconsole 来监视关键缓存命中。

但是,即使在(通过主键)读取单行 100 次之后,缓存命中率也不会增加。该行最近已更新。

那么当 key 缓存打开时,Cassandra 读取流程是什么。是这样的吗?

  1. 检查内存中的 MemTable 中的行(可能在最近插入/更新后驻留在此处)。
  2. 如果在 MemTable 中未找到,则检查 key 缓存中是否有该 key 。
  3. 如果找到键(缓存命中),则进行 1 次查找,否则进行 2 次查找以获取该行。

但是使用 cassandra-clicassandra-jdbc (CQL),我得到了不同的结果。也就是说,即使我最近更新了该行,每次从该行读取都会导致键缓存命中。比如说,我读了 100 遍,我得到了 100 次点击。

为什么会出现这种差异?

嗯,我自己想出了这个办法,但希望有人确认..

看起来更新只会将要更新的列提取到 MemTable 中。因此,当我使用 hector 更新一行时,我没有更新所有列。只有一个列 x 并且正在读取同一列 x 进行读取操作。因此没有缓存命中,因为它已经在 MemTable 中。

在运行 CQL 时,我只是运行了 select * from cf ,这也导致了获取另一列 y 。列y尚未更新,因此我假设它不会在内存中(MemTable),因此导致缓存命中。

最佳答案

当您读取一行时,Memtables 和 SSTables 始终都会被检查,并将结果合并在一起。键缓存仅用于 SSTable,而不用于 memtable(基本上是 HashMap )。

如果您写入一个新行,然后不久之后读取它,则内存表可能还没有被刷新,并且仍然保留该行。在这种情况下,Cassandra 甚至不必查看键缓存,因为它可以快速检查 SSTable 布隆过滤器以查看该行尚不在任何 SSTable 中。所以,在这种情况下,直接返回memtable中的行数据。

如果您强制提前刷新内存表(使用nodetool),然后读取该行几次,您将看到 key 缓存开始被使用。

关于cassandra - Memtable 和 key 缓存混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com