原题目: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 缓存正文。