zoukankan      html  css  js  c++  java
  • 使用google guava做内存缓存

     前几天搞了一天,用redis做缓存,还没用两天,今天负责人要我改用谷歌提供的guava做缓存,说是因为redis用的是集群,不符合项目要求,所以今天上午研究了一下guava的缓存,并成功运行,我对比前两天用到的redis,感觉guava更容易上手,下面介绍下guava的缓存使用方法。

    guava的jar包:链接:http://pan.baidu.com/s/1dEJvmIt 密码:pb96;

    google guava中有cache包,此包提供内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西guava都考虑到了。

    guava中使用缓存需要先声明一个CacheBuilder对象,并设置缓存的相关参数,然后调用其build方法获得一个Cache接口的实例。请看下面的代码和注释,注意在注释中指定了Cache的各个参数。

    package guava;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.TimeUnit;
    
    import com.google.common.cache.CacheBuilder;
    import com.google.common.cache.CacheLoader;
    import com.google.common.cache.LoadingCache;
    
    public class test {
        public static void main(String[] args) throws ExecutionException, InterruptedException{
            //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存
            LoadingCache<String,List> studentCache
                    //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例
                    = CacheBuilder.newBuilder()
                    //设置并发级别为8,并发级别是指可以同时写缓存的线程数
                    .concurrencyLevel(8)
                    //设置写缓存后8秒钟过期
                    .expireAfterWrite(8, TimeUnit.SECONDS)
                    //设置缓存容器的初始容量为10
                    .initialCapacity(10)
                    //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
                    .maximumSize(100)
                   //使用弱引用存储键。当没有(强或软)引用到该键时,相应的缓存项将可以被垃圾回收。由于垃圾回收是依赖==进行判断,因此这样会导致整个缓存也会使用==来比较键的相等性,而不是使用equals();
                   .weakKeys()
                  //使用弱引用存储缓存值。当没有(强或软)引用到该缓存项时,将可以被垃圾回收。由于垃圾回收是依赖==进行判断,因此这样会导致整个缓存也会使用==来比较缓存值的相等性,而不是使用equals();
                   .weakValues()
                    //设置要统计缓存的命中率
                    .recordStats()
                    //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
                    .build(
                            new CacheLoader<String,List>() {
                                @Override
                                public List load(String key) throws Exception {
                                    System.out.println("load student " + key);
                                    List list = new ArrayList<>();
                                    Student student = new Student();
                                    student.setId(key);
                                    student.setName("name " + key);
                                    list.add(student);
                                    return list;
                                }
                            }
                    );
    
            for (int i=0;i<20;i++) {
                //从缓存中得到数据,由于我们没有设置过缓存,所以需要通过CacheLoader加载缓存数据
                 List studen3 = studentCache.get("123");
                 System.out.println(studen3.toString());
                //休眠1秒
                TimeUnit.SECONDS.sleep(1);
            }
          
            
        }
        }
    class Student{
        String id;
        String name;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + "]";
        }
        
    }
                     

    guava的内存缓存非常强大,可以设置各种选项,而且很轻量,使用方便。另外还提供了下面一些方法,来方便各种需要:

    1. ImmutableMap<K, V> getAllPresent(Iterable<?> keys) 一次获得多个键的缓存值
    2. putputAll方法向缓存中添加一个或者多个缓存项
    3. invalidate 和 invalidateAll方法从缓存中移除缓存项
    4. asMap()方法获得缓存数据的ConcurrentMap<K, V>快照
    5. cleanUp()清空缓存
    6. refresh(Key) 刷新缓存,即重新取缓存数据,更新缓存
  • 相关阅读:
    C#中两个日期类型的变量如何进行比较
    Ajax基本原理讲解 (引用别人文章)
    Ajax程序设计入门
    ASP.NET中如何调用存储过程
    删除SAM文件真的能够消除XP系统管理员的密码吗?
    用XMLHttpRequest和struts实现AJAX(译)
    关于邮件系统域名(DNS)设置的小常识
    输出各种二进制流的格式
    WPF 3D编程介绍
    WPF 3D学习笔记
  • 原文地址:https://www.cnblogs.com/lizhen-home/p/7736444.html
Copyright © 2011-2022 走看看