我正在使用具有默認Cassandra緩存設置的Hector從CF中讀取行。 這意味着密鑰緩存已打開。我正在使用jconsole監視關鍵緩存命中。Memtable和鍵緩存混淆
但是即使讀取一行(通過主鍵)100次,緩存命中也不會增加。該行最近已更新。
所以當關鍵緩存打開時,卡桑德拉的讀取流程是什麼。是這樣嗎?
- 檢查內存MemTable中的行(最近插入/更新後可能駐留在那裏)。
- 如果在MemTable中找不到,則會檢查密鑰緩存中的密鑰。
- 如果發現密鑰(緩存命中),一次搜索,否則2次嘗試獲取該行。
但是使用cassandra-cli
和cassandra-jdbc
(CQL),我得到了不同的結果。 也就是說,即使最近更新了該行,每次從該行讀取都會導致鍵緩存命中。說,我讀了100次,我得到100次點擊。
爲什麼這種差異?
嗯,我有種想通了這一點我自己,而是希望有人證實..
看起來更新導致剛剛獲取被更新到MemTable中的列。 因此,當我使用hector更新一行時,我沒有更新所有列。只是一列x
,並且讀取操作的同一列x
。所以沒有緩存命中,因爲它已經在MemTable中。
運行CQL時,我剛剛運行了一個select * from cf
,導致另一列y
也被導入。 y
列未被更新,所以我假設它不會在內存中(MemTable),因此導致緩存命中。
這是否適用於更新行? 而且是存儲在列級的MemTable中的數據?也就是說,在MemTable刷新之後,我只更新一行中的一列'x',並讀取另一列在同一行中說'y',然後由於'y'列尚未加載,鍵緩存再次被擊中MemTable中? – varun 2012-08-15 05:39:41
這應該解釋它是如何工作的:http://wiki.apache.org/cassandra/MemtableSSTable。事情不會回到memtables中;一旦你從sstables讀取任何東西,密鑰緩存將被使用。 – 2012-08-19 05:43:02