1) 根据DataStax的说法,键缓存存储行键的主键索引。
2) 在我们的情况下,我们为键缓存分配了足够的内存,并且同一键存在于多个具有不同列的SSTable中。
3) 如果从多个SSTable中访问所有这些相同的键,则索引如何存储在键缓存中?它会为所有SSTable存储索引,还是仅为最近访问键的最后一个SSTable存储索引?
来自文档
关键缓存按列族的方式在内存中保存键的位置。
关键缓存作为所有存在于其内的SSTable中键的索引。
关键缓存是按SSTable维护的。因此,关键缓存可以每个SSTable节省一个磁盘查找[最小值]。每个键查找最终会命中所有SSTable的布隆过滤器。成功命中关键缓存只是为了跳过SSTable索引[默认情况下每127个键样本的指针]查找。
Cassandra的读取路径如下:
Memtable -> 行缓存(非堆) -> 布隆过滤器 -> 关键缓存 -> SSTable索引[如果未命中] -> 磁盘
加粗的内容表示它们在内存中维护(堆或非堆)。因此,它们不会增加磁盘查找。
每个SSTable都应该维护自己的关键缓存。来源1从第101页和来源2从第23页。
如果关键缓存未命中,则使用SSTable索引 - 这将提供有关键可能位于哪个128th范围的线索。从那时起,对键的磁盘查找开始[可以是1到多个]。
如果我得到任何关于Cassandra如何决定每个SSTable的关键缓存大小的线索,我将再次更新答案[ key_cache_conf/no_of_sstables ]。