2016-09-06 16 views
0

我有一個基於Guava緩存的使用spring緩存的spring應用程序。由於高吞吐量需求和背寫功能,我們正在考慮遷移到Gemfire。 我成功地將Gemfire配置爲緩存,並且能夠從緩存讀取和寫入。在所有的配置示例中,配置需要LocalRegionFactory的定義如下:如何在沒有明確定義區域的情況下爲spring cache manager配置gemfire?

@Bean 
    public Region<Long,Person> myPersonRegion(LocalRegionFactoryBean<Long, Person> personRegion) throws Exception { 

     return personRegion.getObject(); 


    } 

    @Bean 
    public LocalRegionFactoryBean<Long, Person> personRegion(GemFireCache cache,AsyncEventQueue gemfireQueue) { 
     LocalRegionFactoryBean<Long, Person> personRegion = new LocalRegionFactoryBean<>(); 
     personRegion.setCache(cache); 
     personRegion.setClose(false); 
     personRegion.setName("person"); 
     personRegion.setAsyncEventQueues(new AsyncEventQueue[]{gemfireQueue}); 
     personRegion.setPersistent(false); 
     return personRegion; 

    } 

豆被定義後,我們可以使用@Cacheable(值=「人」),@CacheEvict(值=「人」) 。如果我們直接使用緩存名稱,則gemfire會拋出緩存未定義的錯誤。

我們使用番石榴(或Hazelcast,redis等)的經驗是,我們不需要明確定義緩存。它將在第一次發生時由Spring自動創建。

有沒有辦法配置gemfire也以同樣的方式表現?

回答

0

簡短的回答是NO;不完全是。

我不能完全肯定你的下面的語句是完全正確要麼...

我們與番石榴(或Hazelcast,Redis的等)的經驗是,我們並不需要明確定義高速緩存。

對於Hazelcast,我知道這是不是真的recent experience(見configuration,特別this line)。 第78行是絕對必要的(以某種形式或形式,例如XML);沒有它,Spring的緩存抽象將拋出一個異常。

雖然我沒有測試Redis作爲緩存提供者,但確實出現Redis可以處理dynamic Cache creation(也是this)。

很可能不錯,番石榴,像ConcurrentMapCacheManager實現,不需要預先存在Caches明確定義,因爲ConcurrentMapCacheManagerdynamically create the Cache(一ConcurrentHashMap)在運行時要求if NOT explicitly "named"。但是,如果Caches被預先明確命名,則如果Cache尚未定義(即「命名」),則將拋出異常。

我有實例和其他緩存提供商here這說明在實踐中Spring的緩存抽象的不同和相當獨特的UCS,由測試類或測試用例名稱標識的測試。

然而,在所有舉足輕重的GemFire或Apache的Geode測試的例子,你必須明確地創建,將作爲在Spring的緩存基礎設施的「Cache」的地區。雖然,SDG的GemfireCacheManager實現將dynamically create彈簧Cache對象(由底層區域支持),這是彈簧的 AOP CacheInterceptor所要求的。現在

這將導致以下,最小的,必要的配置,以實現與的GemFire /的Geode作爲提供者緩存...

@SpringBootApplication 
@EnableCaching 
class MyCachingApplication { 

    public static void main(String[] args) { 
    SpringApplication.run(MyCachingApplication.class, args); 
    } 

    @Bean 
    GemfireCacheManager cacheManager(GemFireCache gemfireCache) { 
    GemfireCacheManager cacheManager = new GemfireCacheManager(); 
    cacheManager.setCache(gemfireCache); 
    return cacheManager; 
    } 

    // define all Region beans required by the application including Regions 
    // used specifically in Spring's Cache Abstraction 
} 

,話雖如此,我已經基於Spring原型動態創建區從test開始可以看到在整個聲明的應用程序[服務]組件中使用的緩存抽象註釋(例如@Cacheable)。這裏是configuration

正如您所看到的,GemFire區域沒有顯式的bean定義,它將在Spring的高速緩存基礎架構中充當Caches。然而,應用程序的(測試)組件make use of caching

活力的區域創建是在啓動過程中,利用一個BeanPostProcessorhere)和功能的GemFire(使用SDG的功能註釋支持),在運行時動態創建的地區,完成。函數執行是defined here,而實際的函數執行是defined here

該實施例是相當粗(即,不處理定製區configuation(例如逐出/截止,持久性,溢流等)以外DataPolicy),並且是目前設定爲處理對等高速緩存拓撲結構(即,測試應用程序是一個對等體GemFire DS中的成員/節點)。

然而,這是很容易地擴展這個原型在客戶端/服務器拓撲中使用,考慮到所有JSR-107緩存的註釋,並允許更多的自定義域的配置。

隨着時間的推移,這可能是我添加到SDG框架本身的東西。

希望這會有所幫助。

乾杯, 約翰

+0

真的很感謝您提供詳細的說明。我將嘗試測試和BeatPostProcessor方法。幾點: 1. Hazelcast支持動態緩存創建。請找到下面的要點[鏈接](https://gist.github.com/sandheepgr/c715ce530a279b27a8144ef834c19918)。這是一個測試設置,從來沒有爲我們生產。 2.是否有用於後寫配置的特定模式。我已經定義了編寫器和加載器,並立即寫入數據庫(也可以使用異步)。但是不會合並數據以僅寫入上次更新。 – Sandheep

+0

Hi @ Sandheep-我仍然懷疑Hazelcast會動態創建緩存。它至少需要某種分佈式對象(分佈式數據結構),比如Map。即使是「HazelcastCacheManger」源代碼(https://github.com/hazelcast/hazelcast/blob/master/hazelcast-spring/src/main/java/com/hazelcast/spring/cache/HazelcastCacheManager.java#L47-L58)也表示Spring'Cache'存在很多。一個區別可能是您創建了一個客戶端Hazelcast實例(第44行),該實例正在連接到可能已經定義了Map的某個現有集羣。然後... –

+0

對於Hazelcast的'CacheManager'來說,查找和定位(遠程)DistributedObject是一件簡單的事情(https://github.com/hazelcast/hazelcast/blob/master/hazelcast-spring/src/main/java /com/hazelcast/spring/cache/HazelcastCacheManager.java#L61-L71)。在我的配置diff是由Boot創建的HazelcastInstance(https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework的的/ boot /自動配置/ hazelcast/HazelcastAutoConfiguration。java)實際上是一個沒有預先存在的數據結構的嵌入式數據節點,無論如何... –

相關問題