LoadingCache缓存使用(LoadingCache)

  • 首先需要引入先关pom依赖(项目源码参考:https://github.com/licunzhi/dream_on_sakura_rain/tree/master/loadingcache_demo)

    选择合适的版本
    
    
        com.google.guava
        guava
        24.1-jre
    

     

  • 在项目启动的时候注册组件Bean(使用注解@Configuration和@Bean)
    注册可以在注解Bean上面添加想要注入的名称,项目使用时可以直接使用注解注入对象
    @Configuration
    public class MyCacheConfiguration {
    
        private static final int EXPIRE_SECONDS = 86400;
    
        /**
         * 定义token缓存, 默认最大数量为3000
         */
        @Bean
        public LoadingCache myCacheStorage() {
            return CacheBuilder.newBuilder().maximumSize(3000).expireAfterWrite(EXPIRE_SECONDS, TimeUnit.SECONDS)
                            .build(new CacheLoader() {
                                @Override
                                public Object load(String name) throws Exception {
                              //在这里可以初始化加载数据的缓存信息,读取数据库中信息或者是加载文件中的某些数据信息
                                    return null;
                                }
                            });
        }
    
    
    }

    其中Object可以定义自己将要放入缓存中的对象类型(自定义)

  • 使用的时候和往常注册类一样实现自动注入即可
  • LoadingCache缓存使用(LoadingCache)_第1张图片

     

  • CacheBuilder:LoadingCache实现类,存储键值形式(本质Map)
    最常用的方法的介绍----------源码中对于各个方法的解释:
    ① 定义对象个数的限制,如果没有定义过期规则则超出限制的时候,会将最远时间最少使用的自动过期保证总数在设置的范围内

    public CacheBuilder maximumSize(long size)

    ②定义过期时间显示(duration:设置持续时间;unit:持续时间单位【备注:右下插图为可用单位】):缓存中数值在指定时间没有值更新会过期

    public CacheBuilder expireAfterWrite(long duration, TimeUnit unit)

     ③同样是定义过期时间,但是这个和上面的有点区别,只要缓存中的数据被访问就会重置数据的缓存时间

    public CacheBuilder expireAfterAccess(long duration, TimeUnit unit)

     

    LoadingCache缓存使用(LoadingCache)_第2张图片

 

使用时   自动注入就可以调用对象的方法put()把缓存信息放置缓存之中;同样的使用get可以获取放入的特定的缓存信息

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

后续补充

之前的博文介绍了基本的使用,再后来的使用中除了定时或者指定去缓存中放数据之外;可以合理的借用load本身方法

 

先上代码后来在进一步解释

 @Test
    public void testLoadCache() throws ExecutionException, InterruptedException {
        LoadingCache cache = CacheBuilder.newBuilder().build(new CacheLoader() {

            @Override
            public String load(String key) throws Exception {
                return new Date().toString();
            }
        });

        System.out.println(cache.get("licunzhi"));

        Thread.sleep(5000);

        // cache.invalidateAll();
        cache.refresh("licunzhi");
        System.out.println(cache.get("licunzhi"));
    }

重写load方法,key就是取值时候的主键,返回就是你自己经过处理之后要和这个key绑定的value

请注意:如果每次去取值的时候希望走load方法 要使用get() 而不是getIfPresent()

但是get方法会抛出异常需要捕捉处理,getIfPersent如果不存在就返回空值,但是不会走load方法去主动填充缓存。

 

 incalidateAll()  缓存中所有的数据失效

 

使用refersh()方法之后也会重新走load方法,这个方法可以重新更新缓存中的来源,保持数据鲜活性

源码注释中解释到:当更新动作没有完成时候,取数据的时候还是之前缓存中的数据,并不是导致程序异常出现

 

个人小小总结,若有不正确之处 还望指出

欢迎加入Java、C、C++交流群,群聊号码:589780530

你可能感兴趣的:(LoadingCache缓存使用(LoadingCache))