• 本地缓存之GUAVA


          项目开发中,很多配置数据需要缓存,一般来说,开发人员都会手动写HashMap,HashSet或者ConcurrentHashMap,ConcurrentHashSet缓存数据,但是这样的缓存往往存在内存泄漏,刷新机制不健全等缺点。实际上有不少第三方组件实现了功能完善的本地缓存,建议大家直接使用成熟的本地缓存组件,这里主要介绍一下google的guava。

          整体来看,guava首次查询数据时使用用户实现的load方法加载数据,之后再次查询该数据就可以直接从内存中获取,不必走load方法了。当然,guava实现了缓存超时,缓存大小限制等管理机制,使用起来十分方便。废话不多说,直接看代码。

    package com.coshaho.learn.guava;
    
    import java.util.concurrent.TimeUnit;
    
    import com.google.common.cache.CacheBuilder;
    import com.google.common.cache.CacheLoader;
    import com.google.common.cache.LoadingCache;
    import com.google.common.cache.Weigher;
    
    /**
     * 
     * BaseCache.java Create on 2017年2月21日 下午9:42:55    
     *    
     * 类功能说明: GUAVA缓存
     *
     * Copyright: Copyright(c) 2013 
     * Company: COSHAHO
     * @Version 1.0
     * @Author coshaho
     */
    public abstract class BaseCache<K, V> 
    {
    	private LoadingCache<K,V> cache;
    
        public BaseCache()
        {
            cache = CacheBuilder.newBuilder()
            		.maximumSize(10000)
                    .build(new CacheLoader<K, V>() {
                        @Override
                        public V load(K k) throws Exception 
                        {
                            return loadData(k);
                        }
                    });
        }
    
        /**
         * 超时缓存:数据写入缓存超过一定时间自动刷新
         * @param duration
         * @param timeUtil
         */
        public BaseCache(long duration, TimeUnit timeUtil)
        {
            cache = CacheBuilder.newBuilder()
                    .expireAfterWrite(duration, timeUtil)
                    .build(new CacheLoader<K, V>() {
                        @Override
                        public V load(K k) throws Exception 
                        {
                            return loadData(k);
                        }
                    });
        }
        
        /**
         * 限容缓存:缓存数据个数不能超过maxSize
         * @param maxSize
         */
        public BaseCache(long maxSize)
        {
            cache = CacheBuilder.newBuilder()
                    .maximumSize(maxSize)
                    .build(new CacheLoader<K, V>() {
                        @Override
                        public V load(K k) throws Exception 
                        {
                            return loadData(k);
                        }
                    });
        }
        
        /**
         * 权重缓存:缓存数据权重和不能超过maxWeight
         * @param maxWeight
         * @param weigher:权重函数类,需要实现计算元素权重的函数
         */
        public BaseCache(long maxWeight, Weigher<K, V> weigher)
        {
            cache = CacheBuilder.newBuilder()
                    .maximumWeight(maxWeight)
                    .weigher(weigher)
                    .build(new CacheLoader<K, V>() {
                        @Override
                        public V load(K k) throws Exception 
                        {
                            return loadData(k);
                        }
                    });
        }
    
    
        /**
         * 
         * 缓存数据加载方法
         * @author coshaho 
         * @param k
         * @return
         */
        protected abstract V loadData(K k);
    
        /**
         * 
         * 从缓存获取数据
         * @author coshaho 
         * @param param
         * @return
         */
        public V getCache(K param)
        {
            return cache.getUnchecked(param);
        }
    
        /**
         * 
         * 清除缓存数据,缓存清除后,数据会重新调用load方法获取
         * @author coshaho 
         * @param k
         */
        public void refresh(K k)
        {
            cache.refresh(k);
        }
        
        /**
         * 
         * 主动设置缓存数据
         * @author coshaho 
         * @param k
         * @param v
         */
        public void put(K k, V v)
        {
            cache.put(k, v);
        }
    }
  • 相关阅读:
    面向对象程序设计寒假作业2
    终于开通了园子里的贴号
    java中与类继承相关的知识点
    动态代理机制之查看一个类或接口中有哪些方法
    动态代理
    xml与html的区别
    深入理解linux i节点(inode)
    netstat命令
    关于C++ const 的全面总结
    linux 下 进程和线程的区别
  • 原文地址:https://www.cnblogs.com/coshaho/p/6426643.html
Copyright © 2020-2023  润新知