过期策略
如果一个条目已经过期,它将不能从缓存返回。如果缓存没有配置过期政策,默认为永久有效的策略(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 – 永不过期,这时默认值。