Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching cassandra和行缓存更新_Caching_Cassandra_Row - Fatal编程技术网

Caching cassandra和行缓存更新

Caching cassandra和行缓存更新,caching,cassandra,row,Caching,Cassandra,Row,Cassandra具有行缓存以提高读取性能。我有一个用例,其中一个表有20个字段,其中只有2个字段(f1和f2)对任何给定行更新/更改的频率更高,而其他字段是非常静态的 如果行缓存最初包含特定主键K1的行值(整行),则读取该行(整行)将很快。稍后,如果我更新此行的f1和f2字段(假设f1和f2新值在memtable-内存中),则 1) 读取这一行(整行)是否同样快,即是否有任何磁盘访问 2) 仅读取此行的f1和f2字段(值在memtable中)会很快吗 3) 仅读取此行的其他值(f1和f2除外,

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

如果行缓存最初包含特定主键K1的行值(整行),则读取该行(整行)将很快。稍后,如果我更新此行的f1和f2字段(假设f1和f2新值在memtable-内存中),则

1) 读取这一行(整行)是否同样快,即是否有任何磁盘访问

2) 仅读取此行的f1和f2字段(值在memtable中)会很快吗


3) 仅读取此行的其他值(f1和f2除外,它们长时间未更改/更改/更新且在行缓存中)会很快吗?

如果写入一行,则该行的行缓存将失效,并且在读取之前不会再次缓存。

卡桑德拉读取路径:

  • 如果行在行缓存中,则返回数据
  • 否则,检查布卢姆过滤器。如果bloom筛选器指示SSTables中不存在该行,则我们不必读取SSTables,只需从MemTable读取
  • 否则,读取MemTable并读取每个必须读取的SSTable,并与MemTable中的数据合并
  • 使用合并的数据更新行缓存
  • 将返回合并的数据
  • 因此,在您的示例中,键的第一整行
    K1
    都在行缓存中。然后更新了
    f1
    f2
    ,这样整行将从行缓存中失效

  • 如果读取整行,将从MemTable或同时从MemTable和SSTables读取行缓存未命中和数据。所以会很慢

  • 如果读取
    f1
    f2
    ,行缓存将丢失,如果数据不在SSTables中,则仅从MemTable读取(快速),否则同时从MemTable和SSTables读取(慢速)

  • 除f1和f2之外的读取字段必须位于SSTables中,以便从SSTables和MemTable中读取数据。所以会很慢


  • 谢谢你的快速回复。在上面的例子(1)中,效率不是很低吗。Cassandra可以将行中的2个字段标记为无效,当它必须返回一行时,可以从memtable中获取2个更改的字段,更新行缓存并返回该行(将很快)-Cassandra是否有任何计划进行此优化。快速意味着什么?是几微秒吗?慢意味着-8毫秒到40毫秒?卡桑德拉的正常读取延迟可以是亚毫秒,只要您有一个经过合理调整的堆和较小(有效)的分区大小。