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
  @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的几个缓存注解使用就行了,这里放一张截图,这些注解用法,网上很多:[/code]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详细介绍高性能Java缓存库Caffeine

    1.介绍 在本文中,我们来看看Caffeine- 一个高性能的 Java 缓存库. 缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item. 回收策略为在指定时间删除哪些对象.此策略直接影响缓存的命中率 - 缓存库的一个重要特征. Caffeine 因使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率. 2.依赖 我们需要在 pom.xml 中添加 caffeine 依赖: <dependency> <groupId>com.github.ben-

  • SpringBoot2整合Redis缓存三步骤代码详解

    遵循SpringBoot三板斧 第一步加依赖 <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- redis依赖commons-pool 这个依赖一定要添加 --> <

  • spring boot+spring cache实现两级缓存(redis+caffeine)

    spring boot中集成了spring cache,并有多种缓存方式的实现,如:Redis.Caffeine.JCache.EhCache等等.但如果只用一种缓存,要么会有较大的网络消耗(如Redis),要么就是内存占用太大(如Caffeine这种应用内存缓存).在很多场景下,可以结合起来实现一.二级缓存的方式,能够很大程度提高应用的处理效率. 内容说明: 缓存.两级缓存 spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明 spring boot

  • springboot使用GuavaCache做简单缓存处理的方法

    问题背景 实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号). 项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号.由于服务商接口的限制,当批量查询时,可能出现同一个账号第一次查询有数据,但第二次查询无数据的情况. 解决方案 基于以上问题,提出用缓存的过期时间来解决. 这时,可用Redis和Guava Cache来解决: 当批量查询时,同一个账号第一次查询有数据则缓存并设置过期时间10s, 后续查询时直接从缓存中取,没有再从服务商查询. 最终采用Guava Cache

  • JavaScript 学习笔记 Black.Caffeine 09.11.28

    1. 之前写的一直都是分散的函数,用到什么功能,就写什么函数,觉得不够整洁,所以这次写的是封装的类,用起来还不错,但是传递参数的时候遇到了不少问题,所以,查阅了很多资料,总结如下: 1)动态绑定事件问题: 需要将onclick事件绑定到对象上,比如列表项.需要用到addEventListener或者attachEvent,用于吧函数操作添加到事件中去,而不是覆盖,但是,attachEvent不支持FF,FF只能用addEventListener.so,就需要一个函数,把它们俩给综合起来,于是乎,

  • SpringBoot中Shiro缓存使用Redis、Ehcache的方法

    SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这shiro基础之上的补充内容 第一种:Redis缓存,将数据存储到redis 并且开启session存入redis中. 引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac

  • SpringBoot Redis缓存数据实现解析

    这篇文章主要介绍了SpringBoot Redis缓存数据实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.启用对缓存的支持 spring对缓存的支持有两种方式: a.注解驱动的缓存 b.XML声明的缓存 本文主要介绍纯Java配置的缓存,那么必须在配置类上添加@EnableCaching,这样的话就能启动注解驱动的缓存. 2.使用Redis缓存 缓存的条目不过是一个键值对(Key-Value),其中key描述了产生value的操作和

  • SpringBoot加入Guava Cache实现本地缓存代码实例

    这篇文章主要介绍了SpringBoot加入Guava Cache实现本地缓存代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在pom.xml中加入guava依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version>

  • Spring Boot缓存实战 Caffeine示例

    Caffeine和Spring Boot集成 Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava.如果出现Caffeine,CaffeineCacheManager将会自动配置.使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序): spring.cache.caffeine.spec: 定义的特殊缓存 com.github.benmanes.caffeine.cache.

  • Springboot Caffeine本地缓存使用示例

    Caffeine是使用Java8对Guava缓存的重写版本性能有很大提升 一 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- caffeine --> <dependency> <groupId&

  • SpringBoot集成本地缓存性能之王Caffeine示例详解

    目录 引言 Spring Cache 是什么 集成 Caffeine 核心原理 引言 使用缓存的目的就是提高性能,今天码哥带大家实践运用 spring-boot-starter-cache 抽象的缓存组件去集成本地缓存性能之王 Caffeine. 大家需要注意的是:in-memeory 缓存只适合在单体应用,不适合与分布式环境. 分布式环境的情况下需要将缓存修改同步到每个节点,需要一个同步机制保证每个节点缓存数据最终一致. Spring Cache 是什么 不使用 Spring Cache 抽象

  • springboot集成本地缓存Caffeine的三种使用方式(小结)

    目录 第一种方式(只使用Caffeine) 第二种方式(使用Caffeine和spring cache) 第三种方式(使用Caffeine和spring cache) 第一种方式(只使用Caffeine) gradle添加依赖 dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-s

  • SpringBoot使用Caffeine实现缓存的示例代码

    目录 为什么要在应用程序中添加缓存 在Spring Boot应用程序中实现缓存 SpringBoot提供了什么缓存支持? 添加生成依赖项 缓存配置 缓存方法结果 测试缓存是否正常工作 为什么缓存有时会很危险 缓存更新/失效 缓存复制 嵌入式缓存 远程缓存服务器 缓存自定义 缓存密钥 条件缓存 @CachePut 缓存失效 在本博客中,我们将探讨如何使用Spring的缓存框架向任何Spring Boot应用程序添加基本缓存支持,如果没有正确实现,还将探讨缓存的一些问题.最后但并非最不重要的一点是,

  • Java基于LoadingCache实现本地缓存的示例代码

    目录 一. 添加 maven 依赖 二.CacheBuilder 方法说明 三.创建 CacheLoader 四.工具类 五.guava Cache数据移除 一. 添加 maven 依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.1-jre</version> </depend

  • Springboot中使用缓存的示例代码

    在开发中,如果相同的查询条件去频繁查询数据库, 是不是会给数据库带来很大的压力呢? 因此,我们需要对查询出来的数据进行缓存,这样客户端只需要从数据库查询一次数据,然后会放入缓存中,以后再次查询时可以从缓存中读取. Spring3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能.  具体在Springboot中使用缓存如下: 1.在pom.xml中引入cache依赖,添加如下内容: <dependency> <groupI

  • Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐)

    环境配置: JDK 版本:1.8 Caffeine 版本:2.8.0 SpringBoot 版本:2.2.2.RELEASE 一.本地缓存介绍 缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力. 之前介绍过 Redis 这种 NoSql 作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销,增加时耗.本地缓存是直接从本地内存中读取,没有网络开销,例如秒杀系统或者数据量小

  • Java高性能本地缓存框架Caffeine的实现

    目录 一.序言 二.缓存简介 (一)缓存对比 (二)本地缓存 三.SpringCache (一)需求分析 (二)序列化 (三)集成 四.小结 一.序言 Caffeine是一个进程内部缓存框架,使用了Java 8最新的[StampedLock]乐观锁技术,极大提高缓存并发吞吐量,一个高性能的 Java 缓存库,被称为最快缓存. 二.缓存简介 (一)缓存对比 从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性.下面对比三种常用缓存:Redis.EhCache.Caffei

  • Vue+mui实现图片的本地缓存示例代码

    下面一段代码给大家分享基于Vue+mui实现图片的本地缓存,具体代码如下所示: const menu = { state: { products: {}, GLOBAL_CONFIG:GLOBAL_CONFIG['GLOBAL_CONFIG'] }, mutations: { get_product: function (state, products) { //商品列表 state.products = products; for(let i = 0; i < state.products.l

随机推荐