zoukankan      html  css  js  c++  java
  • Guava之缓存

    一、使用场景

      Guava Cache是本地缓存,当数据被重复查询多次,愿意耗费一些内存空间来减少查询的操作提高查询的速度,就可以使用Guava Cache。

    二、使用方式

    1.创建  

      LoadingCache是附带CacheLoader构建而成的缓存实现。创建自己的CacheLoader通常只需要简单地实现V load(K key) throws Exception方法。

      

        private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder()
                .build(new CacheLoader<Integer, String>() {
                    @Override
                    public String load(Integer id) {
                        return getData(id);
                    }
    
                    private String getData(Integer id) {
                        return "tt";
                    }
                });
     

    2.查询

       通过get(K key)查询数据,如果创建时没有抛异常,需要通过 getUnchecked(K key)查询非受检异常数据。

        public String findInfo(Integer id){
            String info = cache.getUnchecked(id);
            return info;
        }

      

    3.缓存回收

      我们不能无限制的往内存中存放数据,需要适当的回收一些数据。

      1.基于容量的回收

      CacheBuilder<K, V> maximumSize(long maximumSize):容量超过了maximumSize就会触发回收,按最近最少使用规则回收。

          2.定时回收

      CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) :超过了一段时间没有访问则会回收

      CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit):超过一段时间没有被修改则会回收

      3.基于引用的回收

      CacheBuilder<K, V> weakKeys():当没有弱引用时被回收。

    4.刷新 

      可以对缓存中的数据进行刷新,这个刷新过程可以是异步的,这样就可以在刷新过程中如果有数据访问直接返回旧值,而不需要等待刷新完成。

      CacheBuilder<K, V> refreshAfterAccess(long duration, TimeUnit unit):当有数据访问后,每隔一段时间进行刷新。所以第一个用户获取当值有可能是旧值。如果没有用户访问,中间是不会刷新的。

      CacheBuilder<K, V> refreshAfterWrite(long duration, TimeUnit unit):当有数据修改后,每隔一段时间刷新。

    示例:

        private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder()
                .maximumSize(10)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(new CacheLoader<Integer, String>() {
                    @Override
                    public String load(Integer id) {
                        return getData(id);
                    }
                    @Override
                    public ListenableFuture<String> reload(Integer id, String old) {
                        ListenableFutureTask<String> futureTask = ListenableFutureTask.create(() -> getData(id));
                        SpringContextHolder.getBean(Executor.class).execute(futureTask);
                        return futureTask;
                    }
    
                    private String getData(Integer id) {
                        return "tt";
                    }
                });
  • 相关阅读:
    第一课:人人站安装与使用教程
    linux 多个python版本的切换
    参考文章
    windows下scrapy 的安装
    vi 使用入门
    linux 源码安装
    C语言—第二次作业
    C语言第0次作业
    c语言博客园作业03函数
    tomcat对于web.xml的securityconstraint使用的处理机制
  • 原文地址:https://www.cnblogs.com/ITyannic/p/12444241.html
Copyright © 2011-2022 走看看