springBoot集成guava cache实现本地缓存

1.前言

整合guava实现限流中我们使用guava--ratelimiter实现了单机限流,本篇我们整合guava实现本地缓存.

2.整个guava cache实现本地缓存

2.1 引入依赖

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <!-- guava-->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1.1-jre</version>
    </dependency>

2.2 定义cacheManager

@Configuration
@EnableCaching
@ConfigurationProperties(prefix = "guava.cache.config")
@Data
public class GuavaCacheConfig {

    private int concurrencyLevel;

    private long maximumSize;

    private long expireAfterWrite;

    private long refreshAfterWrite;

    private int initialCapacity;


    @Bean
    public CacheManager cacheManager() {
        System.out.println(concurrencyLevel);
        System.out.println(maximumSize);
        System.out.println(expireAfterWrite);
        System.out.println(refreshAfterWrite);
        System.out.println(initialCapacity);
        GuavaCacheManager cacheManager = new GuavaCacheManager();
        cacheManager.setCacheBuilder(
                CacheBuilder.newBuilder()
                        //设置并发级别为8   并发级别是指可以同事写缓存的线程数
                        .concurrencyLevel(concurrencyLevel)
                        //设置写缓存后10s过期
                        .expireAfterWrite(expireAfterWrite, TimeUnit.MINUTES)
                        //设置缓存容量的初始容量为10
                        .initialCapacity(initialCapacity)
                        //设置缓存最大容量为100,超过100之后会按照LRU最近最少使用算法来移除缓存项
                        .maximumSize(maximumSize)
                        //设置要统计缓存的命中率
                        .recordStats()
                        //设置缓存移除通知
                        .removalListener(
                                new RemovalListener<Object, Object>() {
                                    @Override
                                    public void onRemoval(RemovalNotification<Object, Object> notification) {
                                        System.out.println(notification.getKey() + " was removed, cause is " + notification.getCause());
                                    }
                                }
                        )
                        //如果缓存过期,恰好有多个线程读取同一个key的值,那么guava只允许一个线程去加载数据,其余线程阻塞。
                        // 这虽然可以防止大量请求穿透缓存,但是效率低下。使用refreshAfterWrite可以做到:只阻塞加载数据的线程,其余线程返回旧数据。
                        //.refreshAfterWrite(refreshAfterWrite, TimeUnit.MINUTES)
                    );
        return cacheManager;
    }
}

2.3 增加配置

guava:
  cache:
    config:
      # 并发级别为,并发级别是指可以同事写缓存的线程数
      concurrencyLevel: 8
      #缓存最大容量,超过之后会按照LRU最近最少使用算法来移除缓存项
      maximumSize: 100
      #设置写缓存后,多长时间过期  时间单位为毫秒
      expireAfterWrite: 10000
      #设置缓存容量的初始容量
      initialCapacity: 10
      #如果缓存过期,恰好有多个线程读取同一个key的值,那么guava只允许一个线程去加载数据,其余线程        
      #阻塞。
      #这虽然可以防止大量请求穿透缓存,但是效率低下。
      #使用refreshAfterWrite可以做到:只阻塞加载数据的线程,其余线程返回旧数据。
      #时间单位为 毫秒
      refreshAfterWrite: 1000

2.4 测试

使用springCache一样.

@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
  
    /**
     * 模拟保存数据
     * @param key
     * @return
     */
    @GetMapping("/set/{key}")
    @CachePut(value = "keyCache",key = "#key")
    public String setKey(@PathVariable String key){
        System.out.println(key);
        //模拟访问数据库
        log.info("~~~~~~访问数据库获保存结果");
        return key;
    }

    /**
     * 模拟从获取数据
     * @param key
     * @return
     */
    @GetMapping("/get/{key}")
    @Cacheable(value = "keyCache",key = "#key")
    public String getKey(@PathVariable String key){
        //模拟访问数据库
        log.info("访问数据库获取结果");
        return key;
    }
}

首先我们模拟保存数据,并添加到本地缓存.

接着我们获取刚才保存的数据,

可以发现 控制台并未打印出 "访问数据库获取结果" 这说明返回的数据是本地缓存内的,至此接入成功啦.

[总结]:guava cache 简单好用,纯java配置,作为本地缓存还是很好用的.避免了想ecache那样比较繁琐的xml配置.

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Spring Boot应用程序,使用Guava Cache实现本地缓存: 首先,需要在pom.xml文件中添加依赖: ``` <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.0-jre</version> </dependency> ``` 然后,创建一个CacheManager bean来管理缓存: ``` @Configuration public class CacheConfig { @Bean public CacheManager cacheManager() { return new GuavaCacheManager("myCache"); } } ``` 在上面的代码中,我们使用GuavaCacheManager创建一个名为“myCache”的缓存管理器。 接下来,创建一个Service bean来使用缓存: ``` @Service public class MyService { @Autowired private CacheManager cacheManager; public String getData(String key) { Cache cache = cacheManager.getCache("myCache"); Cache.ValueWrapper valueWrapper = cache.get(key); if (valueWrapper != null) { return (String) valueWrapper.get(); } else { String data = getDataFromDatabase(key); cache.put(key, data); return data; } } private String getDataFromDatabase(String key) { // 从数据库获取数据 return "data for " + key; } } ``` 在上面的代码中,我们注入了CacheManager bean,并使用它来获取名为“myCache”的缓存。如果缓存中不存在所需的数据,我们从数据库中获取数据并将其放入缓存中。 现在,我们可以测试该应用程序是否正常工作: ``` @RestController public class MyController { @Autowired private MyService myService; @GetMapping("/data") public String getData(@RequestParam String key) { return myService.getData(key); } } ``` 在上面的代码中,我们注入了MyService bean,并在HTTP GET请求中使用它来获取数据。现在,我们可以使用curl或浏览器访问http://localhost:8080/data?key=test,应该会返回“data for test”。如果我们再次访问http://localhost:8080/data?key=test,应该会返回缓存中的数据,而不是从数据库中获取数据。 这就是使用Guava Cache在Spring Boot应用程序中实现本地缓存的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值