1)根据datastax键缓存存储rowkey的主键索引。
2)在我们的例子中,我们为键缓存分配了足够的内存,并且相同的键存在于具有不同列的多个 sstable 中。
3) 如果没有调用从多个 sstables 访问所有这些相同的密钥,那么索引如何存储在密钥缓存中?它会存储所有 sstable 的索引还是仅存储最近访问的最后一个 sstable 的索引?
来自文档
键缓存以每个列族为基础在内存中保存键的位置。
密钥缓存用作它存在的所有 sstable 中的密钥的索引。
每个 sstable 都维护密钥缓存。因此,密钥缓存可以为每个 SSTable [最少] 节省一次磁盘寻道。每个键查找最终都会至少命中所有 sstable 的布隆过滤器。成功时验证密钥缓存只是为了跳过 sstable 索引 [pointers to key sample @ interval of 127 by default] 查找。
阅读 cassandra 的路径是这样的
Memtable -> Row Cache (Off heap) -> Bloom filter -> Key cache -> SSTable Index [if miss] -> Disk
粗体表示的所有内容都保存在内存中(在堆中或堆外)。因此它们不会加起来磁盘寻道
每个 sstable 都应该维护自己的密钥缓存。来自幻灯片 101 的源和来自幻灯片 23 的Source2
在关键缓存未命中的情况下,使用 sstable 索引 - 这将提供线索,即第 128 个范围可能是关键所在。从那时起磁盘寻找键开始[可以是 1 到多个]。
如果我得到任何关于 cassandra 如何决定每个 sstable 的密钥缓存大小可能是 [key_cache_conf/no_of_sstables] 的线索,我将再次更新答案?