2017-04-09 13 views
1

内の個々のエントリのTTLを変更し、例えば、キャッシュ内の個々のエントリで生活する時間を設定することが可能であった:EHCacheなど2.xでEHCacheなど3

Element dependentElement = cache.get(key); 
long lastAccessTime = dependentElement.getLastAccessTime(); 
long creationTime = dependentElement.getCreationTime(); 
int timeToLive = lastAccessTime == 0 ? 300 : (int) 
    (lastAccessTime - creationTime)/1000 + 300; 
timeToLive += 2; 
dependentElement.setTimeToLive(timeToLive); 

これはTTLを更新してしまいますそのため、キャッシュに長く保持されます。

EHCache 3.xでは、これは個々のキャッシュエントリ単位で行うことはもはやできないようです。 Migration Guidethis questionを読んだ後、この機能は直接移行可能ではないようです。

ガイドはTTLを変更するために、インタフェースを実装しなければならないことを教えてくれる:

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, 
    String.class, ResourcePoolsBuilder 
    .withExpiry(new Expiry<Long, String>() {  
     @Override 
     public Duration getExpiryForCreation(Long key, String value) { 
     return getTimeToLiveDuration(key, value); 
     } 

     @Override 
     public Duration getExpiryForAccess(Long key, ValueSupplier<? extends String> value) { 
     return null; // Keeping the existing expiry 
     } 

     @Override 
     public Duration getExpiryForUpdate(Long key, ValueSupplier<? extends String> oldValue, String newValue) { 
     return null; // Keeping the existing expiry 
     } 
    }); 

この構成は、次に初期化するキャッシュに追加されます。ただし、キャッシュレベルの拡張ポイントであるため、変更する実際のエントリに対してメソッドがトリガーされることを保証することはできません。

EHCacheなど3の内部を見ると、古き良きnet.sf.ehcache.Elementを抽象化し、のValueHolderに<V>を変更し、これをアクセスすることはできなくなりましたことをされているようです。

したがって、問題は次のようなものです。EHCache 3.xで同じ動作をどのように実装できますか?エントリが又は更新にアクセスし、を作成するとき

答えて

1

有効期間のみを変更することができます。

正確な要件に応じて、特定のロジックをgetExpiryForAccessに実装し、マッピングにアクセスして更新された有効期限を取得することができます。ただし、の通常のアクセスと、有効期限を更新する必要のあるアクセスとを区別することはできません。 とにかくステートフルな有効期限の計算はお勧めしません。

キャッシュデザインを変更することで、ユースケースをサポートする代替方法があるかもしれませんが、それはこの質問の範囲外です。

+0

ありがとう、それは私が考えたものです。我々は再実施する。 – Raimond

関連する問題