2017-07-16 50 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的正常讀取延遲可能是毫秒級的,只要您有一個合理調整的堆和小(高效)的分區大小。 –