原标题:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程四(Spring中国教育管理中心)
5.5.4.压缩
Apache Geode Regions 也可能被压缩,以减少 JVM 内存消耗和压力,从而可能避免全局 GC。当您为区域启用压缩时,存储在该区域内存中的所有值都将被压缩,而键和索引保持未压缩状态。新值在放入 Region 时被压缩,所有值在从 Region 读回时自动解压缩。当保存到磁盘或通过线路发送到其他对等成员或客户端时,值不会被压缩。
以下示例显示了启用压缩的区域:
<beans> <gfe:replicated-region id="exampleReplicateRegionWithCompression"> <gfe:compressor> <bean class="org.apache.geode.compression.SnappyCompressor"/> </gfe:compressor> </gfe:replicated-region></beans>
有关区域压缩的更多信息,请参阅 Apache Geode 的文档 。
5.5.5.堆外
Apache Geode Regions 也可以配置为将 Region 值存储在堆外内存中,这是 JVM 内存的一部分,不受垃圾收集 (GC) 的影响。通过避免昂贵的 GC 周期,您的应用程序可以将更多时间花在重要的事情上,例如处理请求。
使用堆外内存就像声明要使用的内存量然后启用您的区域使用堆外内存一样简单,如以下配置所示:
<util:properties id="gemfireProperties"> <prop key="off-heap-memory-size">200G</prop></util:properties><gfe:cache properties-ref="gemfireProperties"/><gfe:partitioned-region id="ExampleOffHeapRegion" off-heap="true"/>
您可以通过使用<gfe:cache>元素设置以下 Apache Geode 配置属性来控制堆外内存管理的其他方面:s
<gfe:cache critical-off-heap-percentage="90" eviction-off-heap-percentage"80"/>
Apache GeodeResourceManager将使用这两个阈值 (
critical-off-heap-percentage & eviction-off-heap-percentage) 来更有效地管理堆外内存,其方式与 JVM 在管理堆内存时所做的大致相同。Apache GeodeResourceManager将通过驱逐旧数据来防止缓存消耗过多的堆外内存。如果堆外管理器无法跟上,则ResourceManager拒绝向缓存添加内容,直到堆外内存管理器释放足够数量的内存。
有关管理堆和堆外内存的更多信息,请参阅 Apache Geode 的文档 。
具体来说,请阅读“ 管理堆外内存”部分。
5.5.6.次区域
Spring Data for Apache Geode 也支持 Sub-Regions,允许 Region 以层级关系排列。
例如,Apache Geode 允许一个/Customer/Address区域和一个不同的/Employee/Address区域。此外,一个子区域可能有自己的子区域和配置。子区域不会从其父区域继承属性。区域类型可以混合和匹配受 Apache Geode 约束。Sub-Region 自然地被声明为 Region 的子元素。Sub-Region 的name属性是简单的名称。前面的示例可能配置如下:
<beans> <gfe:replicated-region name="Customer"> <gfe:replicated-region name="Address"/> </gfe:replicated-region> <gfe:replicated-region name="Employee"> <gfe:replicated-region name="Address"/> </gfe:replicated-region></beans>
请注意,该Monospaced ([id])属性不允许用于子区域。子区域是使用 bean 名称创建的(在本例中分别为 /Customer/Address 和 /Employee/Address)。因此,它们可能会GemfireTemplate通过使用区域的完整路径名注入到其他需要它们的应用程序 bean 中,例如。还应在 OQL 查询字符串中使用区域的完整路径名。
5.5.7.区域模板
Spring Data for Apache Geode 也支持 Region 模板。
此功能允许开发人员一次性定义公共 Region 配置和属性,并在 Spring 中声明的多个 Region bean 定义中重用该配置ApplicationContext。
Spring Data for Apache Geode 在其命名空间中包含五个 Region 模板标签:
除了标签之外,具体<gfe:*-region>元素(连同抽象<gfe:*-region-template>元素)还有一个template属性,用于定义区域模板,区域从该模板继承其配置。区域模板甚至可以从其他区域模板继承。
以下示例显示了一种可能的配置:
<beans> <gfe:async-event-queue id="AEQ" persistent="false" parallel="false" dispatcher-threads="4"> <gfe:async-event-listener> <bean class="example.AeqListener"/> </gfe:async-event-listener> </gfe:async-event-queue> <gfe:region-template id="BaseRegionTemplate" initial-capacity="51" load-factor="0.85" persistent="false" statistics="true" key-constraint="java.lang.Long" value-constraint="java.lang.String"> <gfe:cache-listener> <bean class="example.CacheListenerOne"/> <bean class="example.CacheListenerTwo"/> </gfe:cache-listener> <gfe:entry-ttl timeout="600" action="DESTROY"/> <gfe:entry-tti timeout="300 action="INVLIDATE"/> </gfe:region-template> <gfe:region-template id="ExtendedRegionTemplate" template="BaseRegionTemplate" load-factor="0.55"> <gfe:cache-loader> <bean class="example.CacheLoader"/> </gfe:cache-loader> <gfe:cache-writer> <bean class="example.CacheWriter"/> </gfe:cache-writer> <gfe:async-event-queue-ref bean="AEQ"/> </gfe:region-template> <gfe:partitioned-region-template id="PartitionRegionTemplate" template="ExtendedRegionTemplate" copies="1" load-factor="0.70" local-max-memory="1024" total-max-memory="16384" value-constraint="java.lang.Object"> <gfe:partition-resolver> <bean class="example.PartitionResolver"/> </gfe:partition-resolver> <gfe:eviction type="ENTRY_COUNT" threshold="8192000" action="OVERFLOW_TO_DISK"/> </gfe:partitioned-region-template> <gfe:partitioned-region id="TemplateBasedPartitionRegion" template="PartitionRegionTemplate" copies="2" local-max-memory="8192" persistent="true" total-buckets="91"/></beans>
区域模板也适用于子区域。请注意,“
TemplateBasedPartitionRegion”扩展了“PartitionRegionTemplate”,后者扩展了“ExtendedRegionTemplate”,后者扩展了“BaseRegionTemplate”。在后续继承的 Region bean 定义中定义的属性和子元素会覆盖父元素中的内容。
模板的工作原理
Spring Data for Apache Geode 在ApplicationContext解析Spring配置元数据时会应用 Region 模板,因此必须按照继承的顺序声明 Region 模板。换句话说,父模板必须在子模板之前定义。这样做可确保应用正确的配置,尤其是在覆盖元素属性或子元素时。
同样重要的是要记住 Region 类型只能从其他类似类型的 Region 继承。例如, a 不可能<gfe:replicated-region>从 a 继承<
gfe:partitioned-region-template>。
区域模板是单继承的。
关于区域、子区域和查找的注意事项
此前,的基本属性之一replicated-region,partitioned-region,local-region,和client-region在春季的数据元素的Apache的Geode XML命名空间是第一次尝试创建一个区域之前执行查找。这是在 Region 已经存在的情况下完成的,如果该 Region 是在导入的 Apache Geode 本机cache.xml配置文件中定义的,则会出现这种情况。因此,首先执行查找以避免任何错误。这是设计使然,可能会发生变化。
此行为已更改,现在默认行为是先创建区域。如果 Region 已经存在,则创建逻辑会快速失败并抛出适当的异常。但是,与CREATE TABLE IF NOT EXISTS …DDL 语法非常相似 ,Apache Geode <gfe:*-region>XML 命名空间元素的 Spring Data现在包含一个ignore-if-exists属性,该属性通过在尝试创建区域之前首先执行按名称标识的现有区域的查找来恢复旧行为。如果通过名称找到现有 Region 并将ignore-if-exists 其设置为true,则忽略 Spring 配置中定义的 Region bean 定义。
Spring 团队强烈建议仅将replicated-region、partitioned-region、local-region和client-regionXML 命名空间元素严格用于定义新区域。当这些元素定义的 Regions 已经存在并且 Region 元素首先执行查找时可能出现的一个问题是,如果您在应用程序配置中为驱逐、到期、订阅等定义了不同的 Region 语义和行为,那么 Region定义可能不匹配,并可能表现出与应用程序要求的行为相反的行为。更糟糕的是,您可能希望将 Region 定义为分布式 Region(例如,PARTITION),而实际上现有的 Region 定义仅是本地的。
推荐做法-仅使用replicated-region,partitioned-region,local-region,和client-region XML命名空间的元素来定义新的地区。
考虑以下本机 Apache Geodecache.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?><cache xmlns="https://geode.apache.org/schema/cache" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geode.apache.org/schema/cache https://geode.apache.org/schema/cache/cache-1.0.xsd" version="1.0"> <region name="Customers" refid="REPLICATE"> <region name="Accounts" refid="REPLICATE"> <region name="Orders" refid="REPLICATE"> <region name="Items" refid="REPLICATE"/> </region> </region> </region></cache>
此外,请考虑您可能已经定义了一个应用程序 DAO,如下所示:
public class CustomerAccountDao extends GemDaoSupport { @Resource(name = "Customers/Accounts") private Region customersAccounts; ... }
在这里,我们Customers/Accounts在应用程序 DAO 中注入了对Region的引用。因此,开发人员在 Spring XML 配置元数据中为部分或全部这些 Region 定义 bean 的情况并不少见,如下所示:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:gfe="https://www.springframework.org/schema/geode" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/geode https://www.springframework.org/schema/geode/spring-geode.xsd "> <gfe:cache cache-xml-location="classpath:cache.xml"/> <gfe:lookup-region name="Customers/Accounts"/> <gfe:lookup-region name="Customers/Accounts/Orders"/></beans>
该Customers/Accounts和Customers/Accounts/Orders地区作为在Spring容器如豆类引用Customers/Accounts和Customers/Accounts/Orders分别。使用lookup-region 元素和相应语法(前面描述过)的好处在于,它允许您直接引用子区域,而无需为父区域(Customers在本例中为 )定义一个 bean 。
考虑以下错误示例,它更改了配置元数据语法以使用嵌套格式:
<gfe:lookup-region name="Customers"> <gfe:lookup-region name="Accounts"> <gfe:lookup-region name="Orders"/> </gfe:lookup-region></gfe:lookup-region>
现在考虑另一个不好的例子,它使用顶级replicated-region元素和ignore-if-exists属性集来首先执行查找:
<gfe:replicated-region name="Customers" persistent="true" ignore-if-exists="true"> <gfe:replicated-region name="Accounts" persistent="true" ignore-if-exists="true"> <gfe:replicated-region name="Orders" persistent="true" ignore-if-exists="true"/> </gfe:replicated-region></gfe:replicated-region>
Spring 中定义的 Region beansApplicationContext包括以下内容: { "Customers", "/Customers/Accounts", "
/Customers/Accounts/Orders" }.这意味着前面示例中显示的依赖注入引用(即@Resource(name = "Customers/Accounts"))现在已损坏,因为Customers/Accounts实际上没有定义具有 name 的 bean 。因此,您不应像前面两个示例中所示配置区域。
Apache Geode 可以灵活地引用带有或不带有前导斜杠的父区域和子区域。例如,父项可以引用为/Customersor Customers,子项可以引用为/Customers/Accounts or Customers/Accounts。但是,Apache Geode 的 Spring Data 在以区域命名 bean 时非常具体。它始终使用正斜杠 (/) 来表示子区域(例如,/Customers/Accounts)。
因此,您应该使用lookup-region前面显示的非嵌套语法或使用前导正斜杠 (/) 定义直接引用,如下所示:
<gfe:lookup-region name="/Customers/Accounts"/><gfe:lookup-region name="/Customers/Accounts/Orders"/>
前面的示例,其中嵌套replicated-region元素用于引用子区域,显示了前面所述的问题。客户、账户和订单区域和子区域是否持久?它们不是持久的,因为区域是在本地 Apache Geodecache.xml配置文件中定义的,REPLICATE并且在缓存 bean 初始化之前就存在(一旦<gfe:cache>元素被处理)。
5.5.8.数据驱逐(溢出)
基于各种限制,每个区域都可以有一个驱逐策略,用于从内存中驱逐数据。目前,在 Apache Geode 中,驱逐适用于最近最少使用的条目(也称为 LRU)。被驱逐的条目要么被破坏,要么被分页到磁盘(称为“溢出到磁盘”)。
Spring Data for Apache Geode 通过使用嵌套eviction元素支持分区区域、复制区域和客户端、本地区域的所有驱逐策略(条目计数、内存和堆使用)。
例如,要配置一个PARTITION Region在内存大小超过512 MB时溢出到磁盘,您可以指定以下配置:
<gfe:partitioned-region id="examplePartitionRegionWithEviction"> <gfe:eviction type="MEMORY_SIZE" threshold="512" action="OVERFLOW_TO_DISK"/></gfe:partitioned-region>
副本不能使用local destroy驱逐,因为这会使它们无效。有关更多信息,请参阅 Apache Geode 文档。
在为溢出配置 Region 时,您应该通过disk-store元素配置存储以获得最大效率。
有关驱逐政策的详细说明,请参阅有关驱逐的 Apache Geode 文档 。