zoukankan      html  css  js  c++  java
  • springboot中使用Caffeine本地缓存

    Caffeine是使用Java8对Guava缓存的重写版本性能有很大提升

    一 依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <!-- caffeine -->
            <dependency>
                <groupId>com.github.ben-manes.caffeine</groupId>
                <artifactId>caffeine</artifactId>
                <version>2.7.0</version>
            </dependency>

    二 配置缓存,单独使用

    只需要配置Bean就可以了,然后进行数据读写,注意这里提供了很多强大的自定义配置,可以查看文档详细配置

     //定义缓存,可直接使用
        @Bean
        public LoadingCache expiryCache(){
            LoadingCache<String, Object> loadingCache = Caffeine.newBuilder()
                    .initialCapacity(100)
                    .maximumSize(1000)
                    //缓存写入/删除监控
                    .writer(new CacheWriter<Object, Object>() {
                        @Override
                        public void write(Object key, Object value) { //此方法是同步阻塞的
                            System.out.println("--缓存写入--:key=" + key + ", value=" + value);
                        }
                        @Override
                        public void delete(Object key, Object value, RemovalCause cause) { System.out.println("--缓存删除--:key=" + key); }
                    })
                    .expireAfterAccess(1, TimeUnit.MINUTES) //过期时间
                    .build((String key)->"刷新的数据"); //cacheload实现类,刷新时候调用
            loadingCache.put("name","侯征");
            return loadingCache;
        }

    测试使用:

    @Autowired
        private LoadingCache loadingCache;
        @GetMapping("/get")
        public Object getValue(String key){
            return loadingCache.get(key);
        }
        @GetMapping("/add")
        public void addValue(String value){
            loadingCache.put(value,value);
        }
        @GetMapping("/delete")
        public void deleteValue(String key){
            loadingCache.invalidate(key);
            loadingCache.invalidateAll();//清楚所有
        }
        @GetMapping("/refresh")
        public void refreshValue(String key){
            //刷新时会根据build方法中中指定的cacheload重新加载
            loadingCache.refresh(key);
        }

    三 配置CacheManager,和spring缓存注解一起使用

    配置CacheManager
        //配置CacheManager
        @Bean(name = "caffeine")
        public CacheManager cacheManagerWithCaffeine() {
            CaffeineCacheManager cacheManager = new CaffeineCacheManager();
            Caffeine caffeine = Caffeine.newBuilder()
                    //cache的初始容量值
                    .initialCapacity(100)
                    //maximumSize用来控制cache的最大缓存数量,maximumSize和maximumWeight(最大权重)不可以同时使用,
                    .maximumSize(1000)
                    //最后一次写入或者访问后过久过期
                    .expireAfterAccess(500, TimeUnit.SECONDS)
                    //创建或更新之后多久刷新,需要设置cacheLoader
                    .refreshAfterWrite(10, TimeUnit.SECONDS);
            cacheManager.setCaffeine(caffeine);
            cacheManager.setCacheLoader(cacheLoader);
            cacheManager.setCacheNames(names);//根据名字可以创建多个cache,但是多个cache使用相同的策略
            cacheManager.setAllowNullValues(false);//是否允许值为空
            return cacheManager;
        }

    配置 cacheload
     /**
         * 必须要指定这个Bean,refreshAfterWrite配置属性才生效
         */
        @Bean
        public CacheLoader<Object, Object> cacheLoader() {
            return new CacheLoader<Object, Object>() {
                @Override
                public Object load(Object key) throws Exception { return null;}
                // 重写这个方法将oldValue值返回回去,进而刷新缓存
                @Override
                public Object reload(Object key, Object oldValue) throws Exception {
                    System.out.println("--refresh--:"+key);
                    return oldValue;
                }
            };
        }


    其他就是在service中配置spring的几个缓存注解使用就行了,这里放一张截图,这些注解用法,网上很多:

    
    
  • 相关阅读:
    83. Remove Duplicates from Sorted List
    35. Search Insert Position
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    111. Minimum Depth of Binary Tree
    169. Majority Element
    171. Excel Sheet Column Number
    190. Reverse Bits
  • 原文地址:https://www.cnblogs.com/houzheng/p/10903388.html
Copyright © 2011-2022 走看看