11

私はehcache 2.5.4で作業しています。

1 日を通してキャッシュし、毎日午前 0 時に新しい値で更新する必要があるオブジェクトがあります。

現在、ehcache の構成では、存続時間とアイドル時間のみを設定できますが、それは、オブジェクトを作成した時間または使用する時間によって異なります。すなわち:

    <cache
    name="cache.expiry.application.date_status"
    maxElementsInMemory="10"
    eternal="false"
    timeToIdleSeconds="60"
    timeToLiveSeconds="50" />

特定の時間に基づいて特定のキャッシュを期限切れにする ehcache を取得する方法はありますか。

4

3 に答える 3

11

私はEhcacheのElementクラスを次のように拡張することでこれを行いました:

class EvictOnGivenTimestampElement extends Element {

    private static final long serialVersionUID = ...;
    private final long evictOn;

    EvictOnGivenTimestampElement(final Serializable key, final Serializable value, final long evictOn) {
        super(key, value);
        this.evictOn = evictOn;
    }

    @Override
    public boolean isExpired() {
        return System.currentTimeMillis() > evictOn;
    }
}

EvictOnGivenTimestampElement残りは、代わりにオブジェクトの新しいインスタンスをキャッシュに入れるのと同じくらい簡単ですElement

このアプローチの利点は、外部の cronjobs などについて心配する必要がないことです。明らかな欠点は、Ehcache API へのアタッチメントであり、あまり頻繁に変更されないことを願っています。

于 2012-12-19T12:30:40.567 に答える
5

EHCache は、特定の期間が経過した後 (キャッシュ内に存在するか、非アクティブであるため) にのみエビクションをサポートします。ただし、次のような方法で削除をスケジュールすることで、これをかなり簡単に達成できるはずです。

    Timer t = new Timer(true);
    Integer interval = 24 * 60 * 60 * 1000; //24 hours
    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);


    t.scheduleAtFixedRate( new TimerTask() {
            public void run() {
                Cache c = //retrieve cache                  
                c.removeAll();                                            
            }
        }, c.getTime(), interval);

この基本的な例では Java Timer クラスを使用して説明していますが、任意のスケジューラを利用できます。真夜中から 24 時間ごと - これが実行され、指定されたキャッシュからすべての要素が削除されます。実際のrunメソッドを変更して、特定の基準に一致する要素を削除することもできます。

アプリケーションの開始時に必ず開始する必要があります。

于 2012-12-18T23:15:13.713 に答える
2

Ehcache 3.2 では、Expiry 拡張機能を実装しました。

public class EvictAtMidnightExpiry implements Expiry {

    @Override
    public Duration getExpiryForCreation(Object key, Object value) {
        DateTime now = new DateTime();
        DateTime resetAt = now.plusDays(1).withTimeAtStartOfDay();
        long difference = resetAt.toDateTime().getMillis() - now.getMillis();
        return Duration.of(difference, TimeUnit.MILLISECONDS);
    }

    @Override
    public Duration getExpiryForAccess(Object key, ValueSupplier value) {
        return null;
    }

    @Override
    public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) {
        return null;
    }
}

現在、ロギングなども行っていますが、クリーンにするためにコードを最小限に抑えました。

次に、構成ビルダーで構成するだけです。

CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(1000)).withExpiry(new EvictAtMidnightExpiry()).build()

独自の「要素」を作成する必要がなく、有効期限または削除ポリシーを開始するために使用されることを確認する必要がないため、明らかに Ehcache は API の 2.5 から 3.2 にいくらか改善されました。ポリシーは現在、キャッシュにバインドされています。

于 2016-12-18T00:43:42.923 に答える