关于Apache Geode的过期策略

首先

如果将Geode用作缓存服务器,那么问题主要是如何清除缓存数据和保持其新鲜度。本文将讨论如何清除数据。

使用最近最少使用(LRU)算法进行配置

在创建区域的阶段,将其设定为LRU规范是最简单的方法。

gfsh>create region --name=lruregion --type=PARTITION_HEAP_LRU

如果使用Region的快捷方式,lru-heap-percentage将会默认设置。如果没有特殊配置,当堆占用超过80%时,数据将开始迁移。如果想要改变这个比例,需要在服务器启动时进行指定。

gfsh>start server --name=server1 --locators=xxx01 --eviction-heap-percentage=90

另外,如果您要使用cash.xml,可以在资源管理器中进行设置。

最近最少使用(LRU)算法的验证

让我们实际尝试一下。

gfsh>put --key="key1" --value="value1" --region=lruregion

gfsh>get --key="key1" --region=lruregion
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Value       : value1

在输入一条数据时,情况如下。

gfsh>show metrics --member=xxx02.yahoo.co.jp --categories=member,region

Member Metrics

Category |            Metric            | Value
-------- | ---------------------------- | -----------
member   | upTime                       | 1686
         | cpuUsage                     | 2
         | currentHeapSize              | 72
         | maximumHeapSize              | 494
region   | totalRegionCount             | 8
         | listOfRegions                | lruregion
         | rootRegions                  | /lruregion
         | totalRegionEntryCount        | 1
         | totalBucketCount             | 1
         | totalPrimaryBucketCount      | 1

我們將持續輸入數據。程式部分不細談。
我們已接近溢出邊緣。

gfsh>show metrics --member=xxx02.yahoo.co.jp --categories=member

Member Metrics

Category |            Metric            | Value
-------- | ---------------------------- | -----------
member   | upTime                       | 2006
         | cpuUsage                     | 16
         | currentHeapSize              | 394
         | maximumHeapSize              | 494

在继续操作后,我们可以确认LRU算法起作用了,我们之前输入的数据已经消失了。

gfsh>get --key="key1" --region=lruregion
Result      : false
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Value       : <NULL>

gfsh>show metrics --member=xxx02.yahoo.co.jp --categories=member

Member Metrics

Category |            Metric            | Value
-------- | ---------------------------- | -----------
member   | upTime                       | 2884
         | cpuUsage                     | 1
         | currentHeapSize              | 131
         | maximumHeapSize              | 494

以下是对上述内容的汉语本地化改写:

作为一个令人担忧的问题,大量的内存被释放,同时引入的数据也被全部清除了。我们还无法确定这是因为测试数据的投入时间几乎相同,还是由于规格不同而造成的。

设定有效期限

为了提高缓存数据的新鲜度,有时候我们会希望设置有效期限。在这种情况下,您可以针对每个区域设置过期时间。

对每一个key设置一个固定的有效期限。

如果对每个键都要设置固定的过期时间,则可以使用entry-time-to-live-expiration。设置的单位是秒。enable-statistics=true是使用过期时间的必要条件。

gfsh>create region --name=ettlregion --entry-time-to-live-expiration=30 --enable-statistics=true --type=REPLICATE
gfsh>put --key=key1 --value=value1 --region=ettlregion
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Old Value   : <NULL>

#15秒後にput
gfsh>put --key=key2 --value=value2 --region=ettlregion
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Old Value   : <NULL>

#key1をputしてから30秒後get 消えている
gfsh>get --key=key1  --region=ettlregion
Result      : false
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Value       : <NULL>

#同じくkey1をputしてから30秒後 key2は残っている
gfsh>get --key=key2  --region=ettlregion
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Value       : value2

在通过put之后的时间内可以确定其有效期已经过期。

在距离key最后一次访问的时间段内设置有效期限。

在希望延長有效期限的情况下,我们可以使用entry-idle-time-expiration来利用高频数据。

gfsh>create region --name=eitregion --entry-idle-time-expiration=30 --enable-statistics=true --type=REPLICATE
gfsh>put --key=key1 --value=value1 --region=eitregion
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Old Value   : <NULL>

# key1と同時にput
gfsh>put --key=key2 --value=value2 --region=eitregion
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Old Value   : <NULL>

#putから15秒後にget
gfsh>get  --key=key1 --region=eitregion
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Value       : value1

#putから30秒後にget key2は消えている
gfsh>get  --key=key2 --region=eitregion
Result      : false
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Value       : <NULL>

#putから30秒後にget 15秒前にgetしたkey1は残っている
gfsh>get  --key=key1 --region=eitregion
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : java.lang.String
Value       : value1

根据各个地区设置有效期限。 jǔ gè gè .)

如果您想要按区域而不是按照关键字进行设置,请使用区域空闲时间到期(region-idle-time-expiration)和区域存活时间到期(region-time-to-live-expiration)。经验证,无论您使用哪种方法,过期的数据将以最后添加的时间为基准适用于该区域内的数据。即使执行get操作,过期时间也不会延长。

关于已经过期的数据

如果设置了有效期限(expiration-action),那么过期的数据将会发生什么取决于该设置。默认情况下,指定的是invalidate,但是在这种情况下,数据仅会变得无效,实际上数据似乎仍然存在。

我们验证发现,如果不使用destroy,内存将不会被释放。

总结

在处理数据的生命周期策略和内存节省等方面,由于需要设定有效期限的场景有很多,因此能够有效地利用将是很好的。

广告
将在 10 秒后关闭
bannerAds