Class DoubleBarrelLRUCache<K extends DoubleBarrelLRUCache.CloneableKey,​V>


  • public final class DoubleBarrelLRUCache<K extends DoubleBarrelLRUCache.CloneableKey,​V>
    extends java.lang.Object
    Simple concurrent LRU cache, using a "double barrel" approach where two ConcurrentHashMaps record entries.

    At any given time, one hash is primary and the other is secondary. get(K) first checks primary, and if that's a miss, checks secondary. If secondary has the entry, it's promoted to primary (NOTE: the key is cloned at this point). Once primary is full, the secondary is cleared and the two are swapped.

    This is not as space efficient as other possible concurrent approaches (see LUCENE-2075): to achieve perfect LRU(N) it requires 2*N storage. But, this approach is relatively simple and seems in practice to not grow unbounded in size when under hideously high load.

    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      static class  DoubleBarrelLRUCache.CloneableKey
      Object providing clone(); the key class must subclass this.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      V get​(K key)  
      void put​(K key, V value)  
      • Methods inherited from class java.lang.Object

        equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • DoubleBarrelLRUCache

        public DoubleBarrelLRUCache​(int maxSize)
    • Method Detail

      • get

        public V get​(K key)
      • put

        public void put​(K key,
                        V value)