如何在没有明确定义区域的情况下为spring cache manager配置gemfire?

时间:2016-09-06 11:37:00

标签: spring caching spring-cache gemfire spring-data-gemfire

我有一个使用基于Guava缓存的spring缓存的spring应用程序。由于高吞吐量需求和后写功能,我们现在正在考虑迁移到Gemfire。 我成功配置Gemfire作为缓存,并能够从缓存中读取和写入。在所有配置示例中,配置需要定义LocalRegionFactory,如下所示:

    @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;

    }

定义bean之后,我们可以使用@Cacheable(value =&#34; person&#34;),@ CacheEvict(value =&#34; person&#34;)。如果我们直接使用缓存名称,gemfire会抛出未定义缓存的错误。

我们对番石榴(或Hazelcast,redis等)的经验是,我们不需要明确定义缓存。它将在第一次出现时由弹簧自动创建。

有没有办法配置gemfire也以同样的方式运行?

1 个答案:

答案 0 :(得分:1)

简短的回答是;不完全是。

我不完全确定您的以下陈述是否完全准确......

  

我们对番石榴(或Hazelcast,redis等)的经验是,我们不需要明确定义缓存。

对于Hazelcast,我知道这不是来自recent experience true (请参阅configuration,特别是this line)。 第78行是绝对必要的(以某种形式或形式,例如XML);没有它, Spring的缓存抽象将抛出异常。

虽然我没有将Redis作为缓存提供程序进行测试,但看起来Redis可以处理dynamic Cache creation(也是this)。

ConcurrentMapCacheManager实施一样,Guava可能不需要明确定义预先存在的Caches,因为ConcurrentMapCacheManagerdynamically create the Cache(a {{ 1}})在运行时请求if NOT explicitly "named"。但是,如果ConcurrentHashMap事先明确命名,那么如果Caches尚未定义(即&#34;命名为&#34;),则会抛出异常。

我有其他缓存提供程序here的示例和测试,它们说明了实践中 Spring 缓存抽象的不同且相当独特的UC,由测试类或测试用例标识名。

但是,在所有Pivotal GemFire或Apache Geode测试示例中,您必须明确创建将用作&#34; Cache&#34;在 Spring的缓存基础架构中。虽然,SDG的Cache实现将dynamically create {em> Spring 所需的Spring GemfireCacheManager对象(由底层区域支持) AOP Cache

这会产生以下最小的必要配置,以便使用GemFire / Geode作为提供程序进行缓存...

CacheInterceptor

现在,说到这一点,我已经基于Spring Cache Abstraction注释(例如@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 } )创建了动态Region创建原型,这些注释在整个声明的应用程序[service]组件中使用,从这个{{3}开始可以看出}。这是test

正如您所看到的,GemFire区域没有明确的bean定义,将在Spring的缓存基础架构中充当@Cacheable。然而,应用程序(测试的)Spring Caches组件确实configuration

动态区域创建是通过使用 Spring make use of cachingBeanPostProcessor)和GemFire函数(使用SDG的函数注释支持)来动态创建的启动期间运行时的区域。函数执行是here,实际的Function实现是defined here

这个例子很粗糙(即不处理@Service之外的自定义区域配置(例如驱逐/过期,持久性,溢出等))并且当前设置为处理对等缓存拓扑(即测试应用程序)是GemFire DS中的对等成员/节点。

但是,扩展此原型以在客户端/服务器拓扑中使用非常容易,考虑所有 Spring JSR-107 缓存注释并允许更多自定义区域配置。

随着时间的推移,这可能是我在SDG框架中添加的内容。

希望这有帮助。

干杯, 约翰