标签分类 技术文章:
当前位置:首页 > Java技术文章 > Guava Cache本地缓存在Spring Boot

Guava Cache本地缓存在Spring Boot应用中的实践总结

  • 发布时间:
  • 作者:码农之家原创
  • 点击:139

这篇文章主要知识点是关于Guava、Cache、本地缓存、Spring、Boot、SpringBoot加入Guava Cache实现本地缓存代码实例 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Spring Boot+Vue全栈开发实战
  • 类型:Spring大小:196.3 MB格式:PDF出版:清华大学出版社作者:王松
立即下载

更多Java相关的学习资源可以参阅 Java电子书程序设计电子书 等栏目。

Guava Cache本地缓存在Spring Boot

概述

在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCacheConfiguration,即使用 ConcurrentMapCacheManager 来实现的缓存。但本文将讲述如何将 Guava Cache缓存应用到 Spring Boot应用中。

Guava Cache是一个全内存的本地缓存实现,而且提供了线程安全机制,所以特别适合于代码中已经预料到某些值会被多次调用的场景

下文就上手来摸一摸它,结合对数据库的操作,我们让 Guava Cache作为本地缓存来看一下效果!

准备工作

准备好数据库和数据表并插入相应实验数据(MySQL)

比如我这里准备了一张用户表,包含几条记录:

详解Guava Cache本地缓存在Spring Boot应用中的实践

我们将通过模拟数据库的存取操作来看看 Guava Cache缓存加入后的效果。

搭建工程:Springboot + MyBatis + MySQL + Guava Cache

pom.xml 中添加如下依赖:

 <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!--for mybatis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>

    <!--for Mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>

    <!-- Spring boot Cache-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <!--for guava cache-->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>27.0.1-jre</version>
    </dependency>

  </dependencies>

建立 Guava Cache配置类

引入 Guava Cache的配置文件 GuavaCacheConfig

@Configuration
@EnableCaching
public class GuavaCacheConfig {

  @Bean
  public CacheManager cacheManager() {
    GuavaCacheManager cacheManager = new GuavaCacheManager();
    cacheManager.setCacheBuilder(
        CacheBuilder.newBuilder().
            expireAfterWrite(10, TimeUnit.SECONDS).
            maximumSize(1000));
    return cacheManager;
  }
}

Guava Cache配置十分简洁,比如上面的代码配置缓存存活时间为 10 秒,缓存最大数目为 1000 个

配置 application.properties

server.port=82

# Mysql 数据源配置
spring.datasource.url=jdbc:mysql://121.116.23.145:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# mybatis配置
mybatis.type-aliases-package=cn.codesheep.springbt_guava_cache.entity
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true

编写数据库操作和 Guava Cache缓存的业务代码

编写 entity

public class User {

  private Long userId;
  private String userName;
  private Integer userAge;

  public Long getUserId() {
    return userId;
  }

  public void setUserId(Long userId) {
    this.userId = userId;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public Integer getUserAge() {
    return userAge;
  }

  public void setUserAge(Integer userAge) {
    this.userAge = userAge;
  }
}

编写 mapper

public interface UserMapper {

  List<User> getUsers();
  int addUser(User user);
  List<User> getUsersByName( String userName );
}

编写 service

@Service
public class UserService {

  @Autowired
  private UserMapper userMapper;

  public List<User> getUsers() {
    return userMapper.getUsers();
  }

  public int addUser( User user ) {
    return userMapper.addUser(user);
  }

  @Cacheable(value = "user", key = "#userName")
  public List<User> getUsersByName( String userName ) {
    List<User> users = userMapper.getUsersByName( userName );
    System.out.println( "从数据库读取,而非读取缓存!" );
    return users;
  }
}

看得很明白了,我们在 getUsersByName接口上添加了注解:@Cacheable。这是 缓存的使用注解之一,除此之外常用的还有 @CachePut@CacheEvit,分别简单介绍一下:

  • @Cacheable:配置在 getUsersByName方法上表示其返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问
  • @CachePut:配置于方法上时,能够根据参数定义条件来进行缓存,其与 @Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中,所以主要用于数据新增和修改操作上
  • @CacheEvict:配置于方法上时,表示从缓存中移除相应数据。

编写 controller

@RestController
public class UserController {

  @Autowired
  private UserService userService;

  @Autowired
  CacheManager cacheManager;

  @RequestMapping( value = "/getusersbyname", method = RequestMethod.POST)
  public List<User> geUsersByName( @RequestBody User user ) {
    System.out.println( "-------------------------------------------" );
    System.out.println("call /getusersbyname");
    System.out.println(cacheManager.toString());
    List<User> users = userService.getUsersByName( user.getUserName() );
    return users;
  }

}

改造 Spring Boot应用主类

主要是在启动类上通过 @EnableCaching注解来显式地开启缓存功能

@SpringBootApplication
@MapperScan("cn.codesheep.springbt_guava_cache")
@EnableCaching
public class SpringbtGuavaCacheApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringbtGuavaCacheApplication.class, args);
  }
}

最终完工的整个工程的结构如下:

详解Guava Cache本地缓存在Spring Boot应用中的实践

实际实验

通过多次向接口 localhost:82/getusersbyname POST数据来观察效果:

详解Guava Cache本地缓存在Spring Boot应用中的实践

可以看到缓存的启用和失效时的效果如下所示(上文 Guava Cache的配置文件中设置了缓存 user的实效时间为 10s):

详解Guava Cache本地缓存在Spring Boot应用中的实践

怎么样,缓存的作用还是很明显的吧!

后 记

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

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

这篇文章主要介绍了SpringBoot加入Guava Cache实现本地缓存代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在pom.xml中加入guava依赖

   <dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
   </dependency>

创建一个CacheService,方便调用

public interface CacheService {
  //存
  void setCommonCache(String key,Object value);
  //取
  Object getCommonCache(String key);
}

其实现类

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.wu.service.CacheService;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;
@Service
public class CacheServiceImpl implements CacheService {
  private Cache<String,Object> commonCache=null;
  @PostConstruct//代理此bean时会首先执行该初始化方法
  public void init(){
    commonCache= CacheBuilder.newBuilder()
        //设置缓存容器的初始化容量为10(可以存10个键值对)
        .initialCapacity(10)
        //最大缓存容量是100,超过100后会安装LRU策略-最近最少使用,具体百度-移除缓存项
        .maximumSize(100)
        //设置写入缓存后1分钟后过期
        .expireAfterWrite(60, TimeUnit.SECONDS).build();
  }
  @Override
  public void setCommonCache(String key, Object value) {
    commonCache.put(key,value);
  }
  @Override
  public Object getCommonCache(String key) {
    return commonCache.getIfPresent(key);
  }
}

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

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到java实现的密码强度检测功、 java实现杨辉三角两种输出、 java中jvm虚拟机栈的作用总、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java使用栈的迷宫算法的实例代码

下一篇:Java输入输出流代码实例用法

展开 +

收起 -

学习笔记
网友NO.652172

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

问题背景 实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。 项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号。由于服务商接口的限制,当批量查询时,可能出现同一个账号第一次查询有数据,但第二次查询无数据的情况。 解决方案 基于以上问题,提出用缓存的过期时间来解决。 这时,可用Redis和Guava Cache来解决: 当批量查询时,同一个账号第一次查询有数据则缓存并设置过期时间10s, 后续查询时直接从缓存中取,没有再从服务商查询。 最终采用Guava Cache来解决,原因是: 应用是部署单台的,不会有分布式的问题 Redis虽然可以实现,但会有通讯时间消耗 Guava Cache使用本地缓存,支持并发 使用GuavaCache可以快速建立缓存 1.需要在启动类上注解@EnableCaching 2.配置CacheManager 3.控制器上注解使用@Cacheable pom.xml parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version1.5.9.RELEASE/version /parent properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding java.version1.8/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework/groupId artifactIdspring-……

网友NO.185665

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

这篇文章主要介绍了SpringBoot加入Guava Cache实现本地缓存代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在pom.xml中加入guava依赖 dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version18.0/version /dependency 创建一个CacheService,方便调用 public interface CacheService { //存 void setCommonCache(String key,Object value); //取 Object getCommonCache(String key);} 其实现类 import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import com.wu.service.CacheService;import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.concurrent.TimeUnit;@Servicepublic class CacheServiceImpl implements CacheService { private CacheString,Object commonCache=null; @PostConstruct//代理此bean时会首先执行该初始化方法 public void init(){ commonCache= CacheBuilder.newBuilder() //设置缓存容器的初始化容量为10(可以存10个键值对) .initialCapacity(10) //最大缓存容量是100,超过100后会安装LRU策略-最近最少使用,具体百度-移除缓存项 .maximumSize(100) //设置写入缓存后1分钟后过期 .expireAfterWrite(60, TimeUnit.SECONDS).build(); } @Override public void setCommonCache(String key, Object value) { commonCache.put(key,value); } @Override public Object getCommonCache(String key) { return commonCache.getIfPresent(……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明