2012-08-12 67 views
3

我正在使用具有默認Cassandra緩存設置的Hector從CF中讀取行。 這意味着密鑰緩存已打開。我正在使用jconsole監視關鍵緩存命中。Memtable和鍵緩存混淆

但是即使讀取一行(通過主鍵)100次,緩存命中也不會增加。該行最近已更新。

所以當關鍵緩存打開時,卡桑德拉的讀取流程是什麼。是這樣嗎?

  1. 檢查內存MemTable中的行(最近插入/更新後可能駐留在那裏)。
  2. 如果在MemTable中找不到,則會檢查密鑰緩存中的密鑰。
  3. 如果發現密鑰(緩存命中),一次搜索,否則2次嘗試獲取該行。

但是使用cassandra-clicassandra-jdbc(CQL),我得到了不同的結果。 也就是說,即使最近更新了該行,每次從該行讀取都會導致鍵緩存命中。說,我讀了100次,我得到100次點擊。

爲什麼這種差異?

嗯,我有種想通了這一點我自己,而是希望有人證實..

看起來更新導致剛剛獲取被更新到MemTable中的列。 因此,當我使用hector更新一行時,我沒有更新所有列。只是一列x,並且讀取操作的同一列x。所以沒有緩存命中,因爲它已經在MemTable中。

運行CQL時,我剛剛運行了一個select * from cf,導致另一列y也被導入。 y列未被更新,所以我假設它不會在內存中(MemTable),因此導致緩存命中。

回答

4

當您讀取一行時,Memtables和SSTables總是被選中,並且結果合併在一起。密鑰緩存僅用於SSTables,而不是memtables(基本上是hashmaps)。

如果你寫了一個新行然後在不久之後讀取它,那麼memtable可能不會被刷新,並且仍然保存該行。在這種情況下,Cassandra甚至不必查看關鍵緩存,因爲它可以快速檢查SSTable布隆過濾器,以查看該行尚未處於任何SSTable中。所以,在這種情況下,memtable中的行數據直接返回。

如果強制刷新memtable(使用nodetool),然後多次讀取該行,您將看到密鑰緩存開始被使用。

+0

這是否適用於更新行? 而且是存儲在列級的MemTable中的數據?也就是說,在MemTable刷新之後,我只更新一行中的一列'x',並讀取另一列在同一行中說'y',然後由於'y'列尚未加載,鍵緩存再次被擊中MemTable中? – varun 2012-08-15 05:39:41

+0

這應該解釋它是如何工作的:http://wiki.apache.org/cassandra/MemtableSSTable。事情不會回到memtables中;一旦你從sstables讀取任何東西,密鑰緩存將被使用。 – 2012-08-19 05:43:02