#chiroito ’s blog

Java を中心とした趣味の技術について

Coherence : Refresh Aheadの有効期間

Coherenceのリフレッシュアヘッドを使用する時に有効期限が10秒のキャッシュで失効間隔の割合を指定したら有効期間がいつに始まっていつまでになるのかが気になったので調べてみました。

前提

expiry-delay 10s
refresh-ahead-factor 0.5

予想

下の図では赤い三角の時点で新しいデータを取得しています。

予想1:10秒感覚で使われるデータが変わる
常に10秒間隔でデータが使用されます。
RDBMSなどのデータソースへのアクセス回数はexpiry-delayだけで見積もれます。

予想2:新たにデータが読み込まれた時点から有効期限が新たに始まる
データが読み込まれてから5秒後に新しいデータを読みに行きます。
RDBMSなどのデータソースへのアクセス回数はexpiry-delayとrefresh-ahead-factorで見積もれます。

結論

結論としては予想2の「新たにデータが読み込まれた時点から有効期限が新たに始まる」です。

サンプルソース

RefreshAhead.xml





refresh-cache
refresh-schema




refresh-schema




10s




com.chirokings.coherence.refresh.RefreshAheadLoader


0.5





RefreshAheadLoader.java
package com.chirokings.coherence.refresh;

import java.util.Date;

import com.tangosol.net.cache.AbstractCacheLoader;

public class RefreshAheadLoader extends AbstractCacheLoader {

@Override
public Object load(Object arg0) {

Date date = new Date();
System.out.println(date);
return date;

}
}
RefreshAheadRun.java
package com.chirokings.coherence;

import java.util.Date;

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class RefreshAheadRun {

public static void main(String[] args) {

NamedCache cache = CacheFactory.getCache("refresh-cache");
Date date = null;
while(true){
Date value = (Date)cache.get("key");
if( date == null || !date.equals(value)){
date = value;
System.err.println("get:"+date);
}
}
}
}
起動時の引数
-Dtangosol.coherence.cacheconfig=RefreshAhead.xml -Xms512M -Xmx512M -Dtangosol.coherence.localhost=127.0.0.1 -Dtangosol.coherence.ttl=0
出力結果
Sat Jan 29 12:00:00 JST 2011
get:Sat Jan 29 12:00:00 JST 2011
Sat Jan 29 12:00:05 JST 2011
get:Sat Jan 29 12:05:00 JST 2011
Sat Jan 29 12:00:10 JST 2011
get:Sat Jan 29 12:00:10 JST 2011
予想1が正の場合は4行目は表示されないはずで、5行目が表示されるタイミングも違うはずです。

参考

13 Read-Through, Write-Through, Write-Behind, and Refresh-Ahead Caching