记忆和密钥缓存混乱

时间:2012-08-12 14:51:49

标签: cassandra hector cql

我正在使用具有默认Cassandra缓存设置的Hector从CF读取行。 这意味着密钥缓存已打开。我正在使用jconsole监视密钥缓存命中。

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

因此,当打开密钥缓存时,Cassandra读取流程是什么。是这样的吗?

  1. 检查内存中的MemTable是否有行(可以在最近的插入/更新后驻留在那里)。
  2. 如果在MemTable中找不到,则会检查密钥缓存中的密钥。
  3. 如果找到密钥(缓存命中),则一个搜索,否则2寻求获取该行。
  4. 但是使用cassandra-clicassandra-jdbc(CQL),我会得到不同的结果。 也就是说,即使我最近更新了行,每次从行读取都会导致密钥缓存命中。说,我读了100次,得到100次点击。

    为什么会出现这种差异?

    我自己有点想出来,但希望有人确认..

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

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

1 个答案:

答案 0 :(得分:4)

当您读取行时,将始终检查Memtables和SSTable,并将结果合并在一起。密钥缓存仅用于SSTable,而不是memtables(基本上是散列图)。

如果你写了一个新的行,然后不久就读了它,那么memtable可能还没有被刷新,仍然会保持行。在这种情况下,Cassandra甚至不必查看密钥缓存,因为它可以快速检查SSTable bloom过滤器以查看该行尚未在任何SSTable中。因此,在这种情况下,memtable中的行数据只是直接返回。

如果强制早期刷新memtable(使用nodetool)然后读取该行几次,您将看到密钥缓存开始被使用。

相关问题