Spring Boot 2.X整合Spring-cache(让你的网站速度飞起来)

 更新时间:2019年09月02日 11:42:49   作者:Hollis在csdn  
这篇文章主要介绍了Spring Boot 2.X整合Spring-cache(让你的网站速度飞起来),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来。

本文目录

一、Spring Cache介绍二、缓存注解介绍三、Spring Boot+Cache实战1、pom.xml引入jar包2、启动类添加@EnableCaching注解3、配置数据库和redis连接4、配置CacheManager5、使用缓存注解6、查看缓存效果7、注意事项

一、Spring Cache介绍

Spring 3.1引入了基于注解的缓存(cache)技术,它本质上是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种注解,就能够达到缓存方法的效果。

Spring Cache接口为缓存的组件规范定义,包含缓存的各种操作集合,并提供了各种xxxCache的实现,如RedisCache,EhCacheCache,ConcurrentMapCache等;

项目整合Spring Cache后每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过,如果有就直接从缓存中获取结果,没有就调用方法并把结果放到缓存。

二、缓存注解介绍

对于缓存声明,Spring的缓存提供了一组java注解:

@CacheConfig:设置类级别上共享的一些常见缓存设置。

  • @Cacheable:触发缓存写入。
  • @CacheEvict:触发缓存清除。
  • @Caching 将多种缓存操作分组
  • @CachePut:更新缓存(不会影响到方法的运行)。

@CacheConfig

@CacheConfig(cacheNames = "user")
@Service
public class UserServiceImpl implements UserService {}

@Cacheable

  • 如果key不存在,查询db,并将结果更新到缓存中。
  • 如果key存在,直接查询缓存中的数据。
  //查询数据库后 数据添加到缓存
  @Override
  @Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")
  public User getUser(Integer id) {
    return repository.getUser(id);
  }

@CachePut

  //修改数据后更新缓存
  @Override
  @CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")
  public User updateUser(User updateUser) {
    return repository.save(updateUser);
  }

@CacheEvict

  //清除一条缓存,key为要清空的数据
  @Override
  @CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")
  public void deleteUser(Integer id) {
    repository.deleteById(id);
  }

三、Spring Boot+Cache实战

1、pom.xml引入jar包

<!-- 引入缓存 starter -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 引入 redis -->
<dependency>
  <groupId&>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、启动类添加@EnableCaching注解

@EnableCaching注解是spring framework中的注解驱动的缓存管理功能,当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。

启动类部分代码如下:

3、配置数据库和redis连接

application.properties部分配置如下:

#配置数据源信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.1:3306/test
spring.datasource.username=root
spring.datasource.password=1234
#配置jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
# Redis服务器地址
spring.redis.host=192.168.1.1
# database
spring.redis.database = 1
# Redis服务器连接端口 使用默认端口6379可以省略配置
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=1234
# 连接池最大连接数(如果配置&lt;=0,则没有限制 )
spring.redis.jedis.pool.max-active=8

4、配置CacheManager

WebConfig.java部分配置如下:

@Bean
  public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //缓存配置对象
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
 
    redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟
        .disableCachingNullValues()       //如果是空值,不缓存
        .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))     //设置key序列化器
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
 
    return RedisCacheManager
        .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
        .cacheDefaults(redisCacheConfiguration).build();
  }

5、使用缓存注解

UserServiceImpl.java中使用缓存注解示例如下:

//查询数据库后 数据添加到缓存
  @Override
  @Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")
  public User getUser(Integer id) {
    return repository.getUser(id);
  }
 
  //清除一条缓存,key为要清空的数据
  @Override
  @CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")
  public void deleteUser(Integer id) {
    repository.deleteById(id);
  }
 
 
  //修改数据后更新缓存
  @Override
  @CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")
  public User updateUser(User updateUser) {
    return repository.save(updateUser);
  }

6、查看缓存效果

启动服务后,访问两次http://localhost:8090/getUser/2接口,从打印日志可以看到,第一次请求打印了sql说明查询了数据库,耗时960,而第二次直接查询的缓存耗时66,增加缓存后速度提升非常明显。


postman访问截图


日志截图

7、注意事项

Spring cache是基于Spring Aop来动态代理机制来对方法的调用进行切面,这里关键点是对象的引用问题,如果对象的方法是内部调用(即 this 引用)而不是外部引用,则会导致 proxy 失效,那么我们的切面就失效,也就是说上面定义的各种注释包括 @Cacheable、@CachePut 和 @CacheEvict 都会失效。

到此Spring Boot 2.X中整合Spring-cache与Redis功能全部实现,有问题欢迎留言沟通哦!

https://github.com/suisui2019/springboot-study

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

相关文章

  • java实现动态数组

    java实现动态数组

    这篇文章主要为大家详细介绍了java实现动态数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • java使用Abobe Acrobat DC生成模板

    java使用Abobe Acrobat DC生成模板

    这篇文章主要介绍了java使用Abobe Acrobat DC生成模板,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot读取yaml文件操作详解

    SpringBoot读取yaml文件操作详解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java的访问修饰符与变量的作用域讲解

    Java的访问修饰符与变量的作用域讲解

    这篇文章主要介绍了Java的访问修饰符与变量的作用域讲解,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • testNG项目通过idea Terminal命令行执行的配置过程

    testNG项目通过idea Terminal命令行执行的配置过程

    这篇文章主要介绍了testNG项目通过idea Terminal命令行执行,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 一文快速掌握Spring Cloud Stream

    一文快速掌握Spring Cloud Stream

    这篇文章主要介绍了Spring Cloud Stream详解,本篇文章所涉及到的demo练习使用的cloud 2021.0.3+ springboot2.6.8,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java创建student类详细代码例子

    Java创建student类详细代码例子

    这篇文章主要给大家介绍了关于Java创建student类的相关资料,学生类(Student)是一种面向对象的编程概念,其主要用于描述学生的属性和行为,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Mybatis详解在注解sql时报错的解决方法

    Mybatis详解在注解sql时报错的解决方法

    MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在,本篇文章带你看看在注解sql时所报出的错误解决
    2022-03-03
  • java多线程下载实例详解

    java多线程下载实例详解

    这篇文章主要介绍了java多线程下载,结合实例形式详细分析了Java多线程文件传输的原理与多线程下载的相关实现技巧,需要的朋友可以参考下
    2015-12-12
  • Java如何获取相对路径文件

    Java如何获取相对路径文件

    这篇文章主要介绍了Java如何获取相对路径文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论