1)根据datastax键缓存存储rowkey的主键索引。
2) 在我们的例子中,我们为键缓存分配了足够的内存,并且相同的键存在于具有不同列的多个 sstables 中。
3) 如果没有调用从多个 sstables 访问所有这些相同的键,那么索引如何存储在键缓存中?它会存储所有 sstable 的索引还是只存储最近访问过的键的最后一个 sstable 的索引?
最佳答案
来自 Doc
The key cache holds the location of keys in memory on a per-column family basis.
键缓存用作所有 sstable 中键的索引。
每个 sstable 维护 key 缓存。因此, key 缓存可以为每个 SSTable [最小] 节省一次磁盘搜索。每个键查找最终都会至少命中所有 sstable 的布隆过滤器。成功时验证 key 缓存只是为了跳过 sstable 索引 [指向 key 样本的指针 @ 间隔默认为 127] 查找。
阅读 cassandra 的路径是这样的
Memtable -> Row Cache (Off heap) -> Bloom filter -> Key cache -> SSTable Index [if miss] -> 磁盘
所有以粗体显示的内容都表示它们保存在内存中(在堆中或堆外)。因此它们不加起来为磁盘搜索
每个 sstable 都应该维护自己的 key 缓存。 Souce来自第 101 号幻灯片和 Source2来自第 23 号幻灯片
如果 key 缓存未命中,则使用 sstable 索引 - 这将提供 key 可能位于第 128 个范围的线索。从那时起,磁盘寻找 key 开始[可以是 1 到多个]。
如果我得到有关 cassandra 如何决定每个 sstable 的 key 缓存大小可能是 [key_cache_conf/no_of_sstables] 的任何线索,我将再次更新答案?
关于caching - 当同一个 key 存在于多个 sstable 中时,cassandra key 缓存如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11100573/