Class CaffeineCache<K,V>
- All Implemented Interfaces:
com.github.benmanes.caffeine.cache.RemovalListener<K,,V> AutoCloseable,org.apache.lucene.util.Accountable,SolrInfoBean,SolrMetricProducer,SolrCache<K,V>
This cache supports either maximum size limit (the number of items) or maximum ram bytes limit, but not both. If both values are set then only maxRamMB limit is used and maximum size limit is ignored.
W-TinyLFU [2] is a near optimal policy that uses recency and frequency to determine which entry to evict in O(1) time. The estimated frequency is retained in a Count-Min Sketch and entries reside on LRU priority queues [3]. By capturing the historic frequency of an entry, the cache is able to outperform classic policies like LRU and LFU, as well as modern policies like ARC and LIRS. This policy performed particularly well in search workloads.
[1] https://github.com/ben-manes/caffeine [2] http://arxiv.org/pdf/1512.00727.pdf [3] http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html
-
Nested Class Summary
Nested classes/interfaces inherited from class org.apache.solr.search.SolrCacheBase
SolrCacheBase.AutoWarmCountRefNested classes/interfaces inherited from interface org.apache.solr.search.SolrCache
SolrCache.StateNested classes/interfaces inherited from interface org.apache.solr.core.SolrInfoBean
SolrInfoBean.Category, SolrInfoBean.Group -
Field Summary
Fields inherited from class org.apache.solr.search.SolrCacheBase
autowarm, regeneratorFields inherited from interface org.apache.lucene.util.Accountable
NULL_ACCOUNTABLEFields inherited from interface org.apache.solr.search.SolrCache
ASYNC_PARAM, CLEANUP_THREAD_PARAM, EVICTIONS_PARAM, HIT_RATIO_PARAM, HITS_PARAM, INITIAL_SIZE_PARAM, INSERTS_PARAM, LOOKUPS_PARAM, MAX_IDLE_TIME_PARAM, MAX_RAM_MB_PARAM, MAX_SIZE_PARAM, RAM_BYTES_USED_PARAM, SIZE_PARAMFields inherited from interface org.apache.solr.metrics.SolrMetricProducer
CATEGORY_ATTR, HANDLER_ATTR, NAME_ATTR, OPERATION_ATTR, PLUGIN_NAME_ATTR, RESULT_ATTR, TYPE_ATTR -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected voidadjustMetrics(long hitsAdjust, long insertsAdjust, long lookupsAdjust) voidclear():TODO: copy from Mapvoidclose()Frees any non-memory resourcescomputeIfAbsent(K key, IOFunction<? super K, ? extends V> mappingFunction) Get an existing element or atomically compute it if missing.:TODO: copy from MapSimple one or two line descriptionintReturns maximum size limit (in MB) if set and supported, -1 otherwise.intReturns maximum size limit (number of items) if set and supported, -1 otherwise.getName()Simple common usage name, e.g.Implementations should return the context used inSolrMetricProducer.initializeMetrics(SolrMetricsContext, Attributes)to ensure proper cleanup of metrics at the end of the life-cycle of this component.The initialization routine.voidinitializeMetrics(SolrMetricsContext parentContext, io.opentelemetry.api.common.Attributes attributes) Implementation should initialize all metrics to aSolrMetricsContextRegistry/MeterProvider withAttributesas the common set of attributes that will be attached to every metric that is initialized for that class/componentvoidinitializeMetrics(SolrMetricsContext solrMetricsContext, io.opentelemetry.api.common.Attributes attributes, String metricName) booleanCheck if this SolrCache supports recursive calls toSolrCache.computeIfAbsent(Object, IOFunction).void:TODO: copy from MaplongvoidsetMaxRamMB(int maxRamMB) Set maximum size limit (in MB), or -1 for unlimited.voidsetMaxSize(int maxSize) Set maximum size limit (number of items), or -1 for unlimited.intsize():TODO: copy from MaptoString()voidwarm(SolrIndexSearcher searcher, SolrCache<K, V> old) Warm this cache associated withsearcherusing theoldcache object.Methods inherited from class org.apache.solr.search.SolrCacheBase
calcHitRatio, getAutowarmDescription, getCategory, getState, getVersion, init, isAutowarmingOn, name, setStateMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.apache.lucene.util.Accountable
getChildResourcesMethods inherited from interface org.apache.solr.search.SolrCache
getState, initialSearcher, name, setStateMethods inherited from interface org.apache.solr.core.SolrInfoBean
getCategory
-
Constructor Details
-
CaffeineCache
public CaffeineCache()
-
-
Method Details
-
init
Description copied from interface:SolrCacheThe initialization routine. Instance specific arguments are passed in theargsmap.The persistence object will exist across different lifetimes of similar caches. For example, all filter caches will share the same persistence object, sometimes at the same time (it must be thread-safe). If null is passed, then the cache implementation should create and return a new persistence object. If not null, the passed in object should be returned again.
Since it will exist across the lifetime of many caches, care should be taken to not reference any particular cache instance and prevent it from being garbage collected (no using inner classes unless they are static).
The persistence object is designed to be used as a way for statistics to accumulate across all instances of the same type of cache, however the object may be of any type desired by the cache implementation.
The
CacheRegeneratoris what the cache uses during auto-warming to regenerate an item in the new cache from an entry in the old cache. -
onRemoval
-
ramBytesUsed
public long ramBytesUsed()- Specified by:
ramBytesUsedin interfaceorg.apache.lucene.util.Accountable
-
get
Description copied from interface:SolrCache:TODO: copy from Map -
computeIfAbsent
public V computeIfAbsent(K key, IOFunction<? super K, ? extends V> mappingFunction) throws IOExceptionDescription copied from interface:SolrCacheGet an existing element or atomically compute it if missing.- Specified by:
computeIfAbsentin interfaceSolrCache<K,V> - Parameters:
key- keymappingFunction- function to compute the element. If the function returns a null result the cache mapping will not be created. NOTE: this function must NOT attempt to modify any mappings in the cache.- Returns:
- existing or newly computed value, null if there was no existing value and it was not possible to compute a new value (in which case the new mapping won't be created).
- Throws:
IOException- if and only if mappingFunction threw an IOException. A cache mapping will not be created in this case
-
put
Description copied from interface:SolrCache:TODO: copy from Map -
remove
-
clear
public void clear()Description copied from interface:SolrCache:TODO: copy from Map -
size
public int size()Description copied from interface:SolrCache:TODO: copy from Map -
close
Description copied from interface:SolrCacheFrees any non-memory resources- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceSolrCache<K,V> - Specified by:
closein interfaceSolrMetricProducer- Throws:
IOException
-
getMaxSize
public int getMaxSize()Description copied from interface:SolrCacheReturns maximum size limit (number of items) if set and supported, -1 otherwise.- Specified by:
getMaxSizein interfaceSolrCache<K,V>
-
setMaxSize
public void setMaxSize(int maxSize) Description copied from interface:SolrCacheSet maximum size limit (number of items), or -1 for unlimited. Note: this has effect only on implementations that support it, it's a no-op otherwise- Specified by:
setMaxSizein interfaceSolrCache<K,V>
-
getMaxRamMB
public int getMaxRamMB()Description copied from interface:SolrCacheReturns maximum size limit (in MB) if set and supported, -1 otherwise.- Specified by:
getMaxRamMBin interfaceSolrCache<K,V>
-
setMaxRamMB
public void setMaxRamMB(int maxRamMB) Description copied from interface:SolrCacheSet maximum size limit (in MB), or -1 for unlimited. Note: this has effect only on implementations that support it, it's a no-op otherwise.- Specified by:
setMaxRamMBin interfaceSolrCache<K,V>
-
adjustMetrics
protected void adjustMetrics(long hitsAdjust, long insertsAdjust, long lookupsAdjust) -
warm
Description copied from interface:SolrCacheWarm this cache associated withsearcherusing theoldcache object.thisandoldwill have the same concrete type. -
isRecursionSupported
public boolean isRecursionSupported()Description copied from interface:SolrCacheCheck if this SolrCache supports recursive calls toSolrCache.computeIfAbsent(Object, IOFunction). Caches backed byConcurrentHashMap.computeIfAbsent(Object, Function)explicitly do not support that, but other caches might.- Specified by:
isRecursionSupportedin interfaceSolrCache<K,V> - Returns:
- whether this cache allows recursive computations
-
getName
Description copied from interface:SolrInfoBeanSimple common usage name, e.g. BasicQueryHandler, or fully qualified class name.- Specified by:
getNamein interfaceSolrInfoBean
-
getDescription
Description copied from interface:SolrInfoBeanSimple one or two line description- Specified by:
getDescriptionin interfaceSolrInfoBean
-
getSolrMetricsContext
Description copied from interface:SolrMetricProducerImplementations should return the context used inSolrMetricProducer.initializeMetrics(SolrMetricsContext, Attributes)to ensure proper cleanup of metrics at the end of the life-cycle of this component. This should be the child context if one was created, or null if the parent context was used.- Specified by:
getSolrMetricsContextin interfaceSolrMetricProducer
-
toString
-
initializeMetrics
public void initializeMetrics(SolrMetricsContext parentContext, io.opentelemetry.api.common.Attributes attributes) Description copied from interface:SolrMetricProducerImplementation should initialize all metrics to aSolrMetricsContextRegistry/MeterProvider withAttributesas the common set of attributes that will be attached to every metric that is initialized for that class/component- Specified by:
initializeMetricsin interfaceSolrMetricProducer- Parameters:
parentContext- The registry that the component will initialize metrics toattributes- Base set of attributes that will be bound to all metrics for that component
-
initializeMetrics
public void initializeMetrics(SolrMetricsContext solrMetricsContext, io.opentelemetry.api.common.Attributes attributes, String metricName)
-