2013-04-30 88 views
3

我與我的首席架構師有關於緩存空值的爭論。他的觀點是,根據定義,空值不會被緩存。緩存空值

現在我的問題是,總是有一個緩存未命中,並且總是輸入一段代碼而沒有任何需要,因爲在我的情況下,空值是完全正確的。

我的問題:這個案件有官方定義嗎?

+6

在什麼情況下「不高速緩存」?你沒有給我們提供足夠的信息給你任何答案。 – 2013-04-30 07:44:54

+0

我們得到了一些代碼,它緩存了一些鍵值對。底層是Ehcache(默認情況下,Ehcache將鍵值對與空值進行緩存,但我們不這樣做)。現在我處於這種情況,即如果空值存儲在緩存中,可以避免大量的db訪問。 – user871611 2013-04-30 07:57:30

+0

緩存實現通常可能非常通用。這意味着您可以在應用程序的任何地方重複使用它如果您的通用緩存設計爲將'null'作爲**未緩存的**。然後,如果只有一個或兩個緩存將'null'作爲緩存值,那麼改變這種行爲是不值得的。然而,如果你真的想要緩存空值,你需要另一個緩存實現(可以擴展原緩存)來緩存'null'。 – Drogba 2013-04-30 08:01:16

回答

3

我懷疑這個案件有官方文件,因爲答案在很大程度上取決於您的使用情況。例如,假設您有一個需要處理200毫秒的Web查詢,該查詢返回null,並且這是一個有效的值。當然你會緩存這個以避免這些額外的200毫秒每次你做查詢。

我個人與你在案件。規則說從來沒有做...很少沒有例外。

+4

規則是指導聰明人和愚人的嚴格服從...... – 2013-04-30 07:52:30

-2

你的首席建築師是對的。做他所說的。如果您有興趣保留沒有值的密鑰記錄,請使用不同的數據結構來存儲這些密鑰,而不是使用空值緩存這些密鑰。我不確定是否有這方面的官方文件,但這是一種標準做法。

1

推測緩存的重點是加速執行並減少不必要的函數調用。

如果向緩存中添加空值可以改善這一點(即總體上降低執行時間),那麼添加它們就會有意義。畢竟,緩存的目的是(通常)加快應用程序的某一部分或整個應用程序的速度,而不是將其視爲鍵/值存儲區

當然,對於類似的任何事情,您應該先測量一下做任何改變。例如。允許大量的空緩存條目可能會強制出現非空條目,這可能會導致繞過緩存更昂貴。

1

你的總設計師試圖成爲一個誰是對的,但他不是: 的NullObjectPattern是用來處理「緩存空值」 http://en.wikipedia.org/wiki/Null_Object_pattern

在很多情況下,這是一個簡單的和麪向對象解決方案來處理緩存的信息。 只需獲取密鑰的值並調用方法即可。該對象知道該怎麼做。 沒有「ifs」,沒有「哦,還有其他列表」和「我們很慢,因爲我們試圖訪問資源來知道,沒有什麼」。

看看這個:他們做了很多工作,只是爲了避免這種「空事」: http://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained