Looking for a drop-in replacement for a java.util.Map

前端 未结 6 2048
夕颜
夕颜 2021-02-01 23:57

Problem

Following up on this question, it seems that a file- or disk-based Map implementation may be the right solution to the problems I mentioned there.

6条回答
  •  北荒
    北荒 (楼主)
    2021-02-02 00:36

    UPDATE (some 4 years after first post...): beware that in newer versions of ehcache, persistence of cache items is available only in the pay product. Thanks @boday for pointing this out.

    ehcache is great. It will give you the flexibility you need to implement the map in memory, disk or memory with spillover to disk. If you use this very simple wrapper for java.util.Map then using it is blindingly simple:

    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.Element;
    
    import org.apache.log4j.Logger;
    
    import com.google.common.collect.Sets;
    
    public class EhCacheMapAdapter implements Map {
        @SuppressWarnings("unused")
        private final static Logger logger = Logger
                .getLogger(EhCacheMapAdapter.class);
    
        public Cache ehCache;
    
        public EhCacheMapAdapter(Cache ehCache) {
            super();
            this.ehCache = ehCache;
        } // end constructor
    
        @Override
        public void clear() {
            ehCache.removeAll();
        } // end method
    
        @Override
        public boolean containsKey(Object key) {
            return ehCache.isKeyInCache(key);
        } // end method
    
        @Override
        public boolean containsValue(Object value) {
            return ehCache.isValueInCache(value);
        } // end method
    
        @Override
        public Set> entrySet() {
            throw new UnsupportedOperationException();
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public V get(Object key) {
            if( key == null ) return null;
            Element element = ehCache.get(key);
            if( element == null ) return null;
            return (V)element.getObjectValue();
        } // end method
    
        @Override
        public boolean isEmpty() {
            return ehCache.getSize() == 0;
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public Set keySet() {
            List l = ehCache.getKeys();
            return Sets.newHashSet(l);
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public V put(K key, V value) {
            Object o = this.get(key);
            if( o != null ) return (V)o;
            Element e = new Element(key,value);
            ehCache.put(e);
            return null;
        } // end method
    
    
        @Override
        public V remove(Object key) {
            V retObj = null;
            if( this.containsKey(key) ) {
                retObj = this.get(key);
            } // end if
            ehCache.remove(key);
            return retObj;
        } // end method
    
        @Override
        public int size() {
            return ehCache.getSize();
        } // end method
    
        @Override
        public Collection values() {
            throw new UnsupportedOperationException();
        } // end method
    
        @Override
        public void putAll(Map m) {
            for( K key : m.keySet() ) {
                this.put(key, m.get(key));
            } // end for
        } // end method
    } // end class
    

提交回复
热议问题