2017-07-16 202 views
0

Cassandra具有行缓存以提高读取性能。我有一个用例,其中一个表有20个字段,其中只有2个字段(f1和f2)更新/更改频繁的任何给定的行,而其他字段非常静态。cassandra和行缓存更新

如果行高速缓存最初包含特定主密钥K1行值(整行),在阅读本行(整个)将是快速的。后来如果我更新这一行的f1和f2字段(假设f1和f2的新值在memtable中 - 在内存中),那么

1)将读取此行(整行)同样快,即将有任何磁盘访问?

2)将读取只是f1和f2字段(值memTable中),此行是快?

3)将读取该行(除f1和f2其他的只是其他值 - 这并没有改变/修改/更新的长,是行高速缓存)要快?

回答

0

如果一个写进来了一排,因为它的行缓存无效,直到它被读取不会再次缓存。

卡桑德拉读取路径:

  1. 如果该行是行缓存,返回数据
  2. 否则检查布隆过滤器。如果布隆过滤器指示该行不存在于SSTables中,那么我们不必读取SSTables,只能从MemTable中读取。
  3. 否则读取MemTable并读取必须读取的每个SSTable并与MemTable中的数据合并
  4. 使用合并数据更新行缓存。
  5. 合并后的数据返回

Cassandra Read Path

所以你的情况首先整行的关键K1是在行缓存中。那么你更新了f1f2,这样整行就从行缓存中失效了。

  1. 如果你读了整个行,​​行缓存缺失和数据将从MemTable中或两者MemTable中和SSTables读取。所以,如果你读f1f2,排高速缓存未命中并且如果不是在SSTables的数据,则只能从MemTable中(快速)读取,否则无论是从MemTable中和SSTables(慢)读这将是缓慢的

  2. 比F1和F2等领域的阅读,必须在SSTables这样的数据将来自SSTables和MemTable中读取。因此,这将是缓慢的

+0

感谢您的快速反应。在上面的情况(1)中,没有效率低下。 Cassandra可以将行的2个字段标记为无效,并且当它必须返回一行时,它可以从memtable中获取2个更改的字段,更新行缓存并返回行(将会很快) - 是否有任何计划让cassandra进行此优化。还有什么意思呢 - 是几微秒?慢的意思是 - 8ms到40ms? – sunillp

+0

cassandra的正常读取延迟可能是毫秒级的,只要您有一个合理调整的堆和小(高效)的分区大小。 –