关于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,内存将不会被释放。
总结
在处理数据的生命周期策略和内存节省等方面,由于需要设定有效期限的场景有很多,因此能够有效地利用将是很好的。