我有一个使用基于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也以同样的方式运行?
答案 0 :(得分:1)
简短的回答是否;不完全是。
我不完全确定您的以下陈述是否完全准确......
我们对番石榴(或Hazelcast,redis等)的经验是,我们不需要明确定义缓存。
对于Hazelcast,我知道这不是来自recent experience的 true (请参阅configuration,特别是this line)。 第78行是绝对必要的(以某种形式或形式,例如XML);没有它, Spring的缓存抽象将抛出异常。
虽然我没有将Redis作为缓存提供程序进行测试,但看起来Redis可以处理dynamic Cache
creation(也是this)。
与ConcurrentMapCacheManager
实施一样,Guava可能不需要明确定义预先存在的Caches
,因为ConcurrentMapCacheManager
将dynamically 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 caching(BeanPostProcessor
)和GemFire函数(使用SDG的函数注释支持)来动态创建的启动期间运行时的区域。函数执行是here,实际的Function实现是defined here。
这个例子很粗糙(即不处理@Service
之外的自定义区域配置(例如驱逐/过期,持久性,溢出等))并且当前设置为处理对等缓存拓扑(即测试应用程序)是GemFire DS中的对等成员/节点。
但是,扩展此原型以在客户端/服务器拓扑中使用非常容易,考虑所有 Spring 和 JSR-107 缓存注释并允许更多自定义区域配置。
随着时间的推移,这可能是我在SDG框架中添加的内容。
希望这有帮助。
干杯, 约翰