原题目:Spring 认证中国教育管理中心 -Apache Geode 的 Spring 数据教程十三(Spring 中国教育管理中心)
6.12.6. 配置堆外内存
另一种升高 JVM 堆内存压力和最小化 GC 流动的无效办法是应用 Apache Geode 的堆外内存反对。
不是将 Region 条目存储在 JVM 堆上,而是将条目存储在零碎的主内存中。堆外内存通常在存储的对象大小统一、大多数小于 128K 且不须要常常反序列化时成果最佳,如 Apache Geode 用户指南 中所述。
要启用堆外,请应用 正文应用程序类 @EnableOffHeap,如下所示:
启用了堆外的 Spring 应用程序
@SpringBootApplication
@PeerCacheApplication
@EnableOffHeap(memorySize = 8192m regionNames = { “Customers”, “Orders”})
class ServerApplication {..}
该 memorySize 属性是必须的。该 memorySize 属性的值以兆字节 (m) 或千兆字节 (g)为单位指定区域能够应用的主内存量。
该 regionNames 属性是一个区域名称数组,用于指定在主内存中存储条目标区域。默认状况下,如果 regionNames 未明确设置该属性,则所有区域都应用主内存。
或者,您能够应用文件中的
spring.data.gemfire.cache.off-heap.memory-size 和 spring.data.gemfire.cache.off-heap.region-names 属性 application.properties 来设置和配置这些 @EnableOffHeap 正文属性的值。
6.12.7. 配置磁盘存储
或者,您能够配置 Regions 以将数据长久化到磁盘。您还能够将 Region 配置为在驱赶 Region 条目时将数据溢出到磁盘。在这两种状况下,DiskStore 都须要 a 来长久化和 / 或溢出数据。当 DiskStore 尚未为具备持久性或溢出的区域配置显式时,Apache Geode 应用 DEFAULT DiskStore.
咱们倡议在将 DiskStores 数据长久化和 / 或溢出到磁盘时定义特定于区域的。
Spring Data for Apache GeodeDiskStores 通过应用 @EnableDiskStore 和 @EnableDiskStores 正文对应用程序类进行正文,为定义和创立应用程序区域提供正文反对。
@EnableDiskStores 是用于聚合一个或多个 @EnableDiskStore 正文的复合正文。
例如,尽管 Book 信息可能次要由来自某些内部数据源(例如 Amazon)的参考数据组成,但 Order 数据很可能在实质上是事务性的,并且是应用程序须要保留的货色(甚至可能溢出到磁盘,如果交易量足够高)——无论如何,任何图书出版商和作者都心愿如此。
应用 @EnableDiskStore 注解,你能够定义和创立一个 DiskStore 如下:
Spring 利用程序定义了一个 DiskStore
@SpringBootApplication
@PeerCacheApplication
@EnableDiskStore(name = “OrdersDiskStore”, autoCompact = true, compactionThreshold = 70,
maxOplogSize = 512, diskDirectories = @DiskDiretory(location = "/absolute/path/to/order/disk/files"))
class ServerApplication {..}
同样,DiskStore 能够应用复合 @EnableDiskStores 正文定义多个。
正如在 Spring 数据其余正文为 Apache 的 Geode 的基于注解配置模型中,@EnableDiskStore 并 @EnableDiskStores 有相干的配置属性一起许多属性自定义 DiskStores 创立在运行时。
此外,@EnableDiskStores 正文定义了某些通用 DiskStore 属性,这些属性实用于 DiskStores 从 @EnableDiskStore 由 @EnableDiskStores 正文自身组成的正文创立的所有内容。单个 DiskStore 配置笼罩特定的全局设置,但 @EnableDiskStores 正文不便地定义了通用配置属性,这些属性实用于 DiskStores 正文聚合的所有内容。
Spring Data for Apache Geode 还提供了 DiskStoreConfigurer 回调接口,能够在 Java 配置中申明,代替配置属性 DiskStore 在运行时自定义一个,如下例所示:
具备自定义 DiskStore 配置的 Spring 应用程序
@SpringBootApplication
@PeerCacheApplication
@EnableDiskStore(name = “OrdersDiskStore”, autoCompact = true, compactionThreshold = 70,
maxOplogSize = 512, diskDirectories = @DiskDiretory(location = "/absolute/path/to/order/disk/files"))
class ServerApplication {
@Bean
DiskStoreConfigurer ordersDiskStoreDiretoryConfigurer(
@Value("${orders.disk.store.location}") String location) {return (beanName, diskStoreFactoryBean) -> {if ("OrdersDiskStore".equals(beanName) {diskStoreFactoryBean.setDiskDirs(Collections.singletonList(new DiskDir(location));
}
}
}
}
无关可用属性以及相干配置属性的更多详细信息,请参阅 Javadoc@EnableDiskStore 和 @EnableDiskStores 注解。
能够在此处找到无关 Apache Geode Region 持久性和溢出(应用 DiskStores)的更多详细信息。
6.12.8. 配置索引
除非能够拜访数据,否则将数据存储在 Region 中没有太大用处。
除了 Region.get(key)操作之外,特地是在事后晓得键的状况下,通常通过对蕴含数据的 Region 执行查问来检索数据。应用 Apache Geode,查问是应用对象查询语言 (OQL) 编写的,客户端心愿拜访的特定数据集在查问的谓词中示意(例如,SELECT * FROM /Books b WHERE b.author.name = ‘Jon Doe’)。
通常,没有索引的查问效率低下。在没有索引的状况下执行查问时,Apache Geode 执行等效于全表扫描。
索引是为查问谓词中应用的对象上的字段创立和保护的,以匹配感兴趣的数据,如查问的投影所表白的那样。能够创立不同类型的索引,例如 键索引 和哈希索引。
Spring Data for Apache Geode 能够轻松地在存储和拜访数据的区域上创立索引。Index 咱们能够像以前一样应用 Spring config 显式申明 bean 定义,而不是应用 IndexJava 创立一个 bean 定义,如下所示:
应用 Java 配置索引 bean 定义
@Bean(“BooksIsbnIndex”)
IndexFactoryBean bookIsbnIndex(GemFireCache gemfireCache) {
IndexFactoryBean bookIsbnIndex = new IndexFactoryBean();
bookIsbnIndex.setCache(gemfireCache);
bookIsbnIndex.setName("BookIsbnIndex");
bookIsbnIndex.setExpression("isbn");
bookIsbnIndex.setFrom("/Books"));
bookIsbnIndex.setType(IndexType.KEY);
return bookIsbnIndex;
}
或者,咱们能够应用 XML 来创立 Indexbean 定义,如下所示:
应用 XML 的索引 bean 定义
<gfe:index id=”BooksIsbnIndex” expression=”isbn” from=”/Books” type=”KEY”/>
然而,当初您能够间接在您晓得将在查问谓词中应用的应用程序域对象类型的字段上定义索引,以减速这些查问。您甚至能够在应用程序的存储库接口上为从用户定义的查询方法生成的 OQL 查问利用索引。
从新应用之前的示例 Book 实体类,咱们能够正文 Book 咱们晓得在咱们应用 BookRepository 接口中的查询方法定义的查问中应用的字段,如下所示:
应用索引对一本书建模的应用程序域对象类型
@Region(“Books”)
class Book {
@Id
private ISBN isbn;
@Indexed
private Author author;
private Category category;
private LocalDate releaseDate;
private Publisher publisher;
@LuceneIndexed
private String title;
}
在咱们的新 Book 类的定义,咱们诠释了 author 与现场 @Indexed 和 title 与现场 @LuceneIndexed。此外,该 isbn 字段之前已应用 Spring Data 的 @Id 正文进行了正文,该正文标识蕴含 Book 实例惟一标识符的字段,并且在 Spring Data for Apache Geode 中,@Id 正文的字段或属性在存储条目时用作 Region 中的键.
@Id 带正文的字段或属性会导致创立 Apache GeodeKEY 索引。
@Indexed 带正文的字段或属性会导致创立 Apache Geode HASHIndex(默认值)。
@LuceneIndexed 带正文的字段或属性会导致创立 Apache Geode Lucene 索引,在基于文本的搜寻中应用 Apache Geode 的 Lucene 集成和反对。
当在 @Indexed 不设置任何属性的状况下应用正文时,索引 name、expression 和 fromClause 派生自 @Indexed 增加了正文的类的字段或属性。的 expression 正是字段或属性的名称。该 fromClause 从派生 @Region 的域对象的类正文,或域对象类的简略名称,如果 @Region 没有指定正文进行。
当然,您能够显式设置任何 @Indexed 正文属性来笼罩 Spring Data for Apache Geode 提供的默认值。
应用程序域对象类型应用自定义索引对 Book 进行建模
@Region(“Books”)
class Book {
@Id
private ISBN isbn;
@Indexed(name = “BookAuthorNameIndex”, expression = “author.name”, type = “FUNCTIONAL”)
private Author author;
private Category category;
private LocalDate releaseDate;
private Publisher publisher;
@LuceneIndexed(name = “BookTitleIndex”, destory = true)
private String title;
}
该 name 指数,这是主动生成的,当没有明确设置的,也被用作索引的 Spring 容器注册的 bean 的名字。如有必要,这个索引 bean 甚至能够按名称注入到另一个应用程序组件中。
生成的索引名称遵循以下模式:<Region Name><Field/Property Name><Index Type>Idx. 例如,author 索引的名称将是,BooksAuthorHashIdx。
要启用索引,请应用 正文应用程序类 @EnableIndexing,如下所示:
启用索引的 Spring 应用程序
@SpringBootApplication
@PeerCacheApplication
@EnableEntityDefinedRegions
@EnableIndexing
class ServerApplication {..}
该 @EnablingIndexing 注解没有影响,除非 @
EnableEntityDefinedRegions 也申明。实质上,索引是依据实体类类型的字段或属性定义的,并且必须扫描实体类以查看实体的字段和属性是否存在索引正文。如果没有这个扫描,就找不到索引正文。咱们还强烈建议您限度扫描范畴。
尽管 Spring Data for Apache Geode 存储库(尚不)反对 Lucene 查问,但 SDG 的确通过应用相熟的 Spring 模板设计模式为 Apache Geode Lucene 查问提供了全面 反对。
最初,咱们在本节完结时提供一些应用索引时要记住的额定提醒:
尽管执行 OQL 查问不须要 OQL 索引,但执行基于 Lucene 文本的搜寻须要 Lucene 索引。
OQL 索引不会长久化到磁盘。它们只保留在内存中。因而,当 Apache Geode 节点重新启动时,必须重建索引。
您还须要理解与保护索引相干的开销,特地是因为索引专门存储在内存中,尤其是在更新 Region 条目时。索引“保护”能够 配置 为异步工作。
在重新启动必须重建索引的 Spring 应用程序时,您能够应用的另一种优化是首先事后定义所有索引,而后一次性创立它们,在 Spring Data for Apache Geode 中,当刷新 Spring 容器时会产生这种状况.
您能够事后定义索引,而后通过将正文 define 上的属性设置为 来一次性创立它们。@EnableIndexingtrue
无关 更多详细信息,请参阅 Apache Geode 用户指南中的“一次创立多个索引”。
创立正当的索引是一项重要的工作,因为设计不当的索引可能弊大于利。
无关配置选项的残缺列表,请参阅 @Indexed 正文和 @LuceneIndexed 正文 Javadoc。
6.13. 配置间断查问
Apache Geode 的另一个十分重要和有用的个性是 间断查问。
在反对 Internet 的事物的世界中,事件和数据流来自各处。可能解决和解决大量数据并实时对事件做出反馈是许多应用程序越来越重要的要求。一个例子是主动驾驶汽车。可能实时接管、过滤、转换、剖析和解决数据是实时应用程序的要害区别和特色。
侥幸的是,Apache Geode 在这方面走在了时代的后面。通过应用间断查问 (CQ),客户端应用程序能够表白它感兴趣的数据或事件,并注册侦听器以在事件产生时解决和处理事件。客户端应用程序可能感兴趣的数据表示为 OQL 查问,其中查问谓词用于过滤或辨认感兴趣的数据。当数据被更改或增加并且它与注册的 CQ 的查问谓词中定义的规范相匹配时,客户端应用程序会收到告诉。
Spring Data for Apache Geode 能够轻松定义和注册 CQ,以及相干的侦听器来解决和解决 CQ 事件,而无需 Apache Geode 的所有繁琐工作。SDG 针对 CQ 的新的基于正文的配置建设在间断查问侦听器容器中现有的间断查问反对之上。
例如,假如银行应用程序在每个客户的支票帐户中注册利息以检测透支取款并通过利用透支爱护或告诉客户来解决此事件。而后,应用程序可能会注册以下 CQ:
ClientCache 具备注册 CQ 和侦听器的 Spring 应用程序。
@SpringBootApplication
@ClientCacheApplication(subcriptionEnabled = true)
@EnableContinuousQueries
class PublisherPrintApplication {
@ContinuousQuery(name = "OverdraftProtection", query = "SELECT * FROM /CheckingAccount ca WHERE ca.balance < 0.0")
void handleOverdraft(CqEvent event) {// Quick!!! Put more money into the checking account or notify the customer of the checking account!}
}
要启用间断查问,请应用 @EnableContinuousQueries.
定义间断查问包含 @Component 应用 @ContinuousQuery 正文(以相似于 SDG 的函数正文 POJO 办法的形式)正文任何 Spring 正文的 POJO 类办法。@ContinuousQuery 任何时候增加或更改与查问谓词匹配的数据时,都会调用应用正文通过 CQ 定义的 POJO 办法。
此外,该 POJO 办法签名要保持对局部中列出的要求 中 ContinuousQueryListener 和
ContinuousQueryListenerAdapter。
无关可用属性和配置设置的更多详细信息,请参阅 Javadoc@EnableContinuousQueries 和 @ContinuousQuery 正文。
能够在此处找到无关 Spring Data for Apache Geode 的间断查问反对的更多详细信息。
能够在此处找到无关 Apache Geode 的间断查问的更多详细信息。
6.14. 配置 Spring 的缓存形象
应用 Spring Data for Apache Geode,Apache Geode 能够用作 Spring 缓存形象中的缓存提供者。
在 Spring 的 Cache Abstraction 中,缓存注解(例如 @Cacheable)标识在调用潜在低廉操作之前执行缓存查找的缓存。在调用操作后缓存应用程序服务办法的后果。
在 Spring Data for Apache Geode 中,SpringCache 间接对应于 Apache Geode Region。在调用任何缓存正文的应用程序服务办法之前,该区域必须存在。对于辨认要在服务操作中应用的缓存的任何 Spring 缓存注解(即 @Cacheable、@CachePut 和 @CacheEvict),都是如此。
举例来说,咱们的出版商的定点销售点(POS)应用程序可能有一个特点,确定或查找的 Price 的 Book 销售交易过程中,如上面的示例所示:
@Service
class PointOfSaleService
@Cacheable(“BookPrices”)
Price runPriceCheckFor(Book book) {
...
}
@Transactional
Receipt checkout(Order order) {
...
}
…
}
当您将 Spring Data for Apache Geode 与 Spring 的缓存形象联合应用时,为了使您的工作更轻松,咱们向基于注解的配置模型增加了两个新性能。
思考以下 Spring 缓存配置:
应用 Apache Geode 作为缓存提供者启用缓存
@EnableCaching
class CachingConfiguration {
@Bean
GemfireCacheManager cacheManager(GemFireCache gemfireCache) {
GemfireCacheManager cacheManager = new GemfireCacheManager();
cacheManager.setCache(gemfireCache);
return cacheManager;
}
@Bean(“BookPricesCache”)
ReplicatedRegionFactoryBean<Book, Price> bookPricesRegion(GemFireCache gemfireCache) {
ReplicatedRegionFactoryBean<Book, Price> bookPricesRegion =
new ReplicatedRegionFactoryBean<>();
bookPricesRegion.setCache(gemfireCache);
bookPricesRegion.setClose(false);
bookPricesRegion.setPersistent(false);
return bookPricesRegion;
}
@Bean(“PointOfSaleService”)
PointOfSaleService pointOfSaleService(..) {
return new PointOfSaleService(..);
}
}
应用 Spring Data for Apache Geode 的新个性,您能够将雷同的缓存配置简化为以下内容:
启用 Apache Geode 缓存
@EnableGemfireCaching
@EnableCachingDefinedRegions
class CachingConfiguration {
@Bean(“PointOfSaleService”)
PointOfSaleService pointOfSaleService(..) {
return new PointOfSaleService(..);
}
}
Spring 认证中国教育管理中心 -Apache Geode 的 Spring 数据教程十三
首先,该 @EnableGemfireCaching 注解取代了 Spring@EnableCaching 注解和 CacheManager 在 Spring 配置中声显著式 bean 定义(名为“cacheManager”)的须要。
其次,@
EnableCachingDefinedRegions 注解,就像 @EnableEntityDefinedRegions“配置区域”中形容的注解一样,查看整个 Spring 应用程序,缓存带注解的服务组件以辨认应用程序在运行时须要的所有缓存,并在应用程序启动时在 Apache Geode 中为这些缓存创立区域.
创立的区域对于创立区域的应用程序过程来说是本地的。如果应用程序是 peer Cache,则区域仅存在于应用程序节点上。如果应用程序是 ClientCache,则 SDG 会创立客户端 PROXY 区域,并冀望集群中的服务器上已存在这些具备雷同名称的区域。
SDG 无奈应用 Spring 确定服务办法所需 CacheResolver 的缓存,以在运行时解析操作中应用的缓存。
SDG 还反对应用程序服务组件上的 JCache (JSR-107) 缓存正文。请参阅外围 Spring 框架参考指南,理解用于代替 JCache 缓存正文的等效 Spring 缓存正文。