Java Caching JSR107介绍(三)

过期策略

如果一个条目已经过期,它将不能从缓存返回。如果缓存没有配置过期政策,默认为永久有效的策略(Eternal),其中的缓存条目永不会过期。

Eternal过期策略不允许条目过期,但实现可能在需要时回收这些条目。

过期策略可以在配置时提供一个ExpiryPolicy实现的设置,见下面的定义。

public interface ExpiryPolicy<K, V> {

   Duration getExpiryForCreatedEntry(Entry<? extends K, ? extends V>entry);

   Duration getExpiryForAccessedEntry(Entry<? extends K, ? extends V>entry);

   Duration getExpiryForModifiedEntry(Entry<? extends K, ? extends V>entry);

}

在特定的缓存操作执行后的一段时间后条目进行回收,该时间由Duration类定义。Duration是由一个java.util.concurrent.TimeUnit和时长durationAmount组成,TimeUnit的最小值为TimeUnit.MILLISECONDS。

到期持续时间取决于所配置的过期政策和执行的缓存操作。下面ExpiryPolicy方法被定义为基于缓存操作的合适的持续时间:

● getExpiryForCreatedEntry()- 当条目创建后的到期持续时间

● getExpiryForAccessedEntry()- 当条目访问后的到期持续时间

● getExpiryForModifiedEntry()- 当条目修改后的到期持续时间

当这些方法被调用时ExpiryPolicy将返回下列值之一:

●持续时间等于缓存配置的过期时间

● Duration.ZERO表明条目目前已经是过期的

此外getExpiryForModifiedEntry()和getExpiryForAccessedEntry()也可能返回null,表示缓存实现应该保留条目的到期时间不变。

下表详细介绍了每个缓存的方法如何和配置的ExpiryPolicy互动。

方法

是否调用

ExpiryPolicy.getExpiryForCreatedEntry?

是否调用

ExpiryPolicy.getExpiryForAccessedEntry?

是否调用

ExpiryPolicy.getExpiryForModifiedEntry?

boolean containsKey(K key)

V get(K key)

否,

除非 read-though 导致加载数据

Map<K,V> getAll(Collection<? extends K> keys)

否,

除非 read-though 导致加载数据

V getAndPut(K key, V value)

是 (当key的值不存在时)

是 (当key的值存在时)

V getAndRemove(K key)

V getAndReplace(K key, V value)

是 (当key的值存在时)

CacheManager getCacheManager()

CacheConfiguration getConfiguration()

String getName()

Iterator<Cache.Entry<K, V>> iterator()

(当条目被iterator访问时)

void loadAll(Set<? extends K> keys, boolean replaceExistingValues, CompletionListener listener)

是(当key没有对应的加载值时)

是(当可以有对应加载值并且被替换时)

void put(K key, V value)

是(当key的值不存在时)

是 (当key的值存在时)

void putAll(Map<? extends K,? extends V> map)

是(当key的值不存在时)

是 (当key的值存在时)

boolean putIfAbsent(K key, V value)

是(当key的值不存在时)

boolean remove(K key)

boolean remove(K key, V oldValue)

void removeAll()

void removeAll(Set<? extends K> keys)

<T> T invoke(K key, EntryProcessor<K, V, T> entryProcessor, Object... arguments)entryProcessor);

是,

当 read-through, getValue和CacheLoader被调用时

是,

当getValue() 调用时

是,

当setValue() 调用时

<T> Map<K, T> invokeAll(Set<? extends K> keys,

EntryProcessor<K, V, T> entryProcessor, Object... arguments);

是,

当 read-through, getValue和CacheLoader被调用时

是,

当getValue() 调用时

是,

当setValue() 调用时

boolean replace(K key, V value)

是 (当key的值存在时)

boolean replace(K key, V oldValue, V newValue)

是(当值未被替换时)

是(当值被替换时)

<T> T unwrap(Class<T> cls)

五种过期策略定义如下:

1. Created –创建后在设定时间内到期。

2. Modified -创建后在设定时间内到期,当条目被更新时刷新到期时间。

3. Accessed -创建后在设定时间内到期,当条目被访问(类似读操作)时刷新到期时间。

4. Touched -创建后在设定时间内到期,当条目被更新或访问时刷新到期时间。

5. Eternal – 永不过期,这时默认值。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。