Class CacheLIRS<K,V>
- Type Parameters:
K
- the key typeV
- the value type
- All Implemented Interfaces:
Function<K,
,V> org.apache.jackrabbit.guava.common.base.Function<K,
,V> org.apache.jackrabbit.guava.common.cache.Cache<K,
,V> org.apache.jackrabbit.guava.common.cache.LoadingCache<K,
V>
A scan resistant cache. It is meant to cache objects that are relatively costly to acquire, for example file content.
This implementation is multi-threading safe and supports concurrent access. Null keys or null values are not allowed. The map fill factor is at most 75%.
Each entry is assigned a distinct memory size, and the cache will try to use at most the specified amount of memory. The memory unit is not relevant, however it is suggested to use bytes as the unit.
This class implements an approximation of the the LIRS replacement algorithm invented by Xiaodong Zhang and Song Jiang as described in http://www.cse.ohio-state.edu/~zhang/lirs-sigmetrics-02.html with a few smaller changes: An additional queue for non-resident entries is used, to prevent unbound memory usage. The maximum size of this queue is at most the size of the rest of the stack. About 6.25% of the mapped entries are cold.
Internally, the cache is split into a number of segments, and each segment is an individual LIRS cache.
Accessed entries are only moved to the top of the stack if at least a number of other entries have been moved to the front (1% by default). Write access and moving entries to the top of the stack is synchronized per segment.
- Author:
- Thomas Mueller
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
A builder for the cache.static interface
Listener for items that are evicted from the cache. -
Constructor Summary
ConstructorsConstructorDescriptionCacheLIRS
(int maxEntries) Create a new cache with the given number of entries, and the default settings (an average size of 1 per entry, 16 segments, and stack move distance equals to the maximum number of entries divided by 100). -
Method Summary
Modifier and TypeMethodDescriptionasMap()
void
cleanUp()
boolean
containsKey
(Object key) Check whether there is a resident entry for the given key.entrySet()
Get the entry set for all resident entries.Get the value, loading it if needed.getAllPresent
(Iterable<?> keys) int
Get the average memory used per entry.getIfPresent
(Object key) Get the value for the given key if the entry is cached.long
Get the maximum memory to use.int
Get the memory used for the given key.getUnchecked
(K key) Get the value, loading it if needed.long
Get the currently used memory.void
invalidate
(Object key) Remove an entry.void
Remove all entries.void
invalidateAll
(Iterable<?> keys) boolean
isEmpty()
keys
(boolean cold, boolean nonResident) Get the list of keys.keySet()
Get the set of keys for resident entries.static <K,
V> CacheLIRS.Builder<K, V> Create a builder.Get the value for the given key if the entry is cached.void
Add an entry to the cache.Add an entry to the cache.void
protected V
putIfAbsent
(K key, V value) void
Re-load the value for the given key.Remove an entry.void
setAverageMemory
(int averageMemory) Set the average memory used per entry.void
setMaxMemory
(long maxMemory) Set the maximum memory this cache should use.long
size()
Get the number of resident entries.int
sizeHot()
Get the number of hot entries in the cache.int
Get the length of the internal map array.int
Get the number of non-resident entries in the cache.protected int
Get the size of the given value.org.apache.jackrabbit.guava.common.cache.CacheStats
stats()
protected Collection<V>
values()
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.apache.jackrabbit.guava.common.base.Function
equals
-
Constructor Details
-
CacheLIRS
public CacheLIRS(int maxEntries) Create a new cache with the given number of entries, and the default settings (an average size of 1 per entry, 16 segments, and stack move distance equals to the maximum number of entries divided by 100).- Parameters:
maxEntries
- the maximum number of entries
-
-
Method Details
-
invalidateAll
public void invalidateAll()Remove all entries. -
containsKey
Check whether there is a resident entry for the given key. This method does not adjust the internal state of the cache.- Parameters:
key
- the key (may not be null)- Returns:
- true if there is a resident entry
-
peek
Get the value for the given key if the entry is cached. This method does not modify the internal state.- Parameters:
key
- the key (may not be null)- Returns:
- the value, or null if there is no resident entry
-
put
Add an entry to the cache. This method is an explicit memory size (weight), and not using the weigher even if configured. The entry may or may not exist in the cache yet. This method will usually mark unknown entries as cold and known entries as hot.- Parameters:
key
- the key (may not be null)value
- the value (may not be null)memory
- the memory used for the given entry- Returns:
- the old value, or null if there was no resident entry
-
put
Add an entry to the cache. If a weigher is specified, it is used, otherwise the average memory size is used. -
get
- Specified by:
get
in interfaceorg.apache.jackrabbit.guava.common.cache.Cache<K,
V> - Throws:
ExecutionException
-
getUnchecked
Get the value, loading it if needed.If there is an exception loading, an UncheckedExecutionException is thrown.
-
get
Get the value, loading it if needed.- Specified by:
get
in interfaceorg.apache.jackrabbit.guava.common.cache.LoadingCache<K,
V> - Parameters:
key
- the key- Returns:
- the value
- Throws:
ExecutionException
-
refresh
Re-load the value for the given key.If there is an exception while loading, it is logged and ignored. This method calls CacheLoader.reload, but synchronously replaces the old value.
-
putIfAbsent
-
getIfPresent
Get the value for the given key if the entry is cached. This method adjusts the internal state of the cache sometimes, to ensure commonly used entries stay in the cache. -
sizeOf
Get the size of the given value. The default implementation returns the average memory as configured for this cache.- Parameters:
key
- the keyvalue
- the value- Returns:
- the size
-
invalidate
Remove an entry. Both resident and non-resident entries can be removed. -
remove
Remove an entry. Both resident and non-resident entries can be removed.- Parameters:
key
- the key (may not be null)- Returns:
- the old value or null
-
invalidateAll
-
getMemory
Get the memory used for the given key.- Parameters:
key
- the key (may not be null)- Returns:
- the memory, or 0 if there is no resident entry
-
getUsedMemory
public long getUsedMemory()Get the currently used memory.- Returns:
- the used memory
-
setMaxMemory
public void setMaxMemory(long maxMemory) Set the maximum memory this cache should use. This will not immediately cause entries to get removed however; it will only change the limit. To resize the internal array, call the clear method.- Parameters:
maxMemory
- the maximum size (1 or larger)
-
setAverageMemory
public void setAverageMemory(int averageMemory) Set the average memory used per entry. It is used to calculate the length of the internal array.- Parameters:
averageMemory
- the average memory used (1 or larger)
-
getAverageMemory
public int getAverageMemory()Get the average memory used per entry.- Returns:
- the average memory
-
getMaxMemory
public long getMaxMemory()Get the maximum memory to use.- Returns:
- the maximum memory
-
entrySet
Get the entry set for all resident entries.- Returns:
- the entry set
-
values
-
keySet
Get the set of keys for resident entries.- Returns:
- the set of keys
-
sizeNonResident
public int sizeNonResident()Get the number of non-resident entries in the cache.- Returns:
- the number of non-resident entries
-
sizeMapArray
public int sizeMapArray()Get the length of the internal map array.- Returns:
- the size of the array
-
sizeHot
public int sizeHot()Get the number of hot entries in the cache.- Returns:
- the number of hot entries
-
size
public long size()Get the number of resident entries. -
keys
Get the list of keys. This method allows to read the internal state of the cache.- Parameters:
cold
- if true, only keys for the cold entries are returnednonResident
- true for non-resident entries- Returns:
- the key list
-
stats
public org.apache.jackrabbit.guava.common.cache.CacheStats stats() -
newBuilder
Create a builder.- Returns:
- the builder
-
getAllPresent
-
asMap
-
cleanUp
public void cleanUp() -
putAll
-
getAll
public org.apache.jackrabbit.guava.common.collect.ImmutableMap<K,V> getAll(Iterable<? extends K> keys) throws ExecutionException - Specified by:
getAll
in interfaceorg.apache.jackrabbit.guava.common.cache.LoadingCache<K,
V> - Throws:
ExecutionException
-
apply
-
isEmpty
public boolean isEmpty()
-