我正在使用具有默认Cassandra缓存设置的Hector从CF读取行。 这意味着密钥缓存已打开。我正在使用jconsole监视密钥缓存命中。
但即使在读取单行(通过主键)100次之后,缓存命中也不会增加。该行最近已更新。
因此,当打开密钥缓存时,Cassandra读取流程是什么。是这样的吗?
但是使用cassandra-cli
和cassandra-jdbc
(CQL),我会得到不同的结果。
也就是说,即使我最近更新了行,每次从行读取都会导致密钥缓存命中。说,我读了100次,得到100次点击。
为什么会出现这种差异?
我自己有点想出来,但希望有人确认..
看起来更新会导致只是将列更新到MemTable中。
因此,当我使用hector更新一行时,我没有更新所有列。只是一列x
并且正在读取同一列x
以进行读取操作。因此,没有缓存命中,因为它已经存在于MemTable中。
在运行CQL时,我只是运行了select * from cf
,这导致了另一列y
的获取。列y
尚未更新,因此我假设它不会在内存中(MemTable),因此导致缓存命中。
答案 0 :(得分:4)
当您读取行时,将始终检查Memtables和SSTable,并将结果合并在一起。密钥缓存仅用于SSTable,而不是memtables(基本上是散列图)。
如果你写了一个新的行,然后不久就读了它,那么memtable可能还没有被刷新,仍然会保持行。在这种情况下,Cassandra甚至不必查看密钥缓存,因为它可以快速检查SSTable bloom过滤器以查看该行尚未在任何SSTable中。因此,在这种情况下,memtable中的行数据只是直接返回。
如果强制早期刷新memtable(使用nodetool)然后读取该行几次,您将看到密钥缓存开始被使用。