2017-06-13 55 views
2

我正在使用Spring Cache,在那裏我傳入一組鍵,而返回的是實體列表。我希望緩存框架明白返回列表中的每個元素都要與相應的代碼一起緩存。目前看來,關鍵是整個列表,如果我在後續調用中丟失了一個鍵,它會嘗試重新加載整個集合。收集物品/實體的Spring Cache

@Override 
@Cacheable(value = "countries") 
public List<Country> getAll(List<String>codes) { 
    return countryDao.findAllInCodes(codes); 
} 

另一種可能性是,返回的是一個地圖,同樣我想緩存足夠聰明,只查詢未曾被前詢問項目,也對它們進行緩存,其關鍵的每個項目。

@Override 
@Cacheable(value = "countries") 
public Map<String,Country> getAllByCode(List<String>codes) { 
    return countryDao.findAllInCodes(codes); 
} 

假設全國類看起來是這樣的:

class Country{ 
    String code; 
    String fullName; 
    long id; 

... // getters setters constructurs etc.. 
} 

這可能與春季緩存?

+0

爲什麼不使用第二級JPA?與EhCache相比,Spring緩存實際上是無可奈何且容易出錯的,用於緩存。 – davidxxx

+0

@davidxxx就我所知,Spring Cache只是一個抽象,而EhCache可以在下面實現。不同之處在於它不需要在註釋之外編寫任何緩存邏輯。我如何用JPA編寫上面的代碼? – Charbel

回答

1

事實上,即使使用Spring's Caching Abstraction,但不是開箱即用(OOTB)。從本質上講,你必須定製Spring的緩存基礎設施(以下進一步說明)

通過默認Spring的緩存架構採用全@Cacheable方法參數的參數作爲緩存的「鑰匙」,作爲解釋here。當然,您也可以使用SpEL表達式或自定義KeyGenerator實現自定義關鍵分辨率,如here所述。

儘管如此,這分手參數參數@Cacheable方法的返回值成單獨的緩存條目一起集合或數組(即,基於陣列/收集或地圖鍵/值對) 。

對於這一點,你需要的自定義實現Spring的CacheManager(取決於您的緩存策略/供應商)和Cache接口。

注:諷刺的是,這將是我已經回答了幾乎相同的問題,首先here,然後here第3次,現在這裏,:-)。無論如何...

我已更新/清理my example(有點)這篇文章。

請注意,my example extends and customizesConcurrentMapCacheManager彈簧框架本身提供。

從理論上說,你可以擴展/自定義任何CacheManager實現,像的Redis的春數據Redis的heresource),或樞紐的GemFire的CacheManager春數據的GemFireheresource)。 樞紐的GemFire的開源版本是的Apache的Geode,其具有相應的彈簧數據的Geode項目,(source for CacheManager彈簧數據的Geode,這基本上等同於SD的GemFire)。當然,你可以應用此技術的Spring的其他緩存提供商... Hazelcast,的Ehcache等

然而,工作的真正的勇氣是由custom implementation處理(或習俗具體地說,base classCache接口。

無論如何,希望從my example,你將能夠找出你的應用程序需要做什麼來滿足你的應用程序的緩存需求。

此外,你可以應用相同的方法來處理Maps,但我會把它作爲一個練習給你,;-)。

希望這會有所幫助!

乾杯, 約翰

+0

謝謝@John我會看看這個,並嘗試執行它以滿足我的需求! – Charbel