我正在使用带有默认 Cassandra 缓存设置的 Hector 从 CF 读取行。这意味着密钥缓存已打开。我正在使用 jconsole 来监视键缓存命中。
但即使在读取单行(通过主键)100 次后,缓存命中率也不会增加。该行最近已更新。
因此,当打开密钥缓存时,Cassandra 读取流程是什么。是这样吗?
- 检查内存中的 MemTable 中的行(可能在最近的插入/更新后驻留在那里)。
- 如果在 MemTable 中找不到,则检查键缓存中的键。
- 如果找到键(缓存命中),则进行一次搜索,否则 2 次寻求获取该行。
但是使用cassandra-cli
and cassandra-jdbc
(CQL),我得到了不同的结果。也就是说,即使我最近更新了该行,每次从该行读取都会导致键缓存命中。比如说,我读了 100 遍,我得到了 100 次点击。
为什么会出现这种差异?
好吧,我自己想通了,但希望有人确认..
看起来更新只是将要更新的列获取到 MemTable 中。因此,当我使用 hector 更新一行时,我并没有更新所有列。只是一列x
并且正在读取同一列x
进行读取操作。所以没有缓存命中,因为它已经在 MemTable 中。
在运行 CQL 时,我只是在运行select * from cf
导致获取另一列的结果y
。该列y
尚未更新,因此我假设它不会在内存中(MemTable),因此导致缓存命中。