计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用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
该注解是可以将缓存分类,它是类级别的注解方式。我们可以这么使用它。
这样的话,UserServiceImpl的所有缓存注解例如@Cacheable的value值就都为user。

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

@Cacheable
一般用于查询操作,根据key查询缓存.

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

@CachePut
@CachePut标注的方法在执行前不会去检查缓存中是否存在,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

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

@CacheEvict
根据key删除缓存中的数据。allEntries=true表示删除缓存中的所有数据。

    //清除一条缓存,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执行处理。

启动类部分代码如下:

@SpringBootApplication
@EnableCaching
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

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
# 连接池最大连接数(如果配置<=0,则没有限制 )
spring.redis.jedis.pool.max-active=8

4、配置CacheManager

WebConfig.java部分配置如下:

@Beanpublic 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,增加缓存后速度提升非常明显。

7、注意事项

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

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

data spring 指定时区_今天的工作内容:Spring Boot 2.X整合Spring-cache相关推荐

  1. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  2. data spring 指定时区_SpringBoot 统一时区的方案

    系统采用多时区设计的时候,往往我们需要统一时区,需要统一的地方如下: 服务器(Tomcat服务) 数据库(JPA + Hibernate) 前端数据(前端采用Vuejs) 思路为: 将数据库和服务器的 ...

  3. data spring 指定时区_SpringBoot 相关时区(TimeZone)设置

    1.启动文件中的TimeZone设置: public static void main(String[] args) { TimeZone timeZone = TimeZone.getTimeZon ...

  4. spring 三级缓存_通过画图+视频把循环依赖、监听器等等spring源码讲明白了

    大家在阅读源码的时候有没有这种感觉:每次要看源码的时候十分信誓旦旦逼迫自己努力看着源码,但是还没看多长时间就会感觉枯燥,无味没意思,所以我是十分不愿意去看源码,但是今天福利来了,有位大神通过画图+视频 ...

  5. Spring Security是什么,以及如何在Spring Boot项目中整合Spring Security并且使用它,下面我们通过一个登录案例简单介绍一下Spring Security。

    1.什么是Spring Security? 在了解Spring Security之前,我们是不是应该先思考一个问题,我们自己写的web案例一般都需要先登录,之后登录之后才能访问其他页面,或者说我们不同 ...

  6. security框架工作笔记001--- Shiro和Spring Security对比_智慧城市项目中选型用Spring Security

    JAVA技术交流QQ群:170933152 Shiro简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Secu ...

  7. Spring Boot整合Spring Data Redis-整合步骤

    如何通过SpringBoot去整合我们的Redis,这里我们先对SpringBoot Redis做一个简单的介绍,其实SpringBoot Redis,和我们之前讲的Spring JPA都是Sprin ...

  8. spring aop示例_具有AOP事务管理的Spring ORM示例

    spring aop示例 This is a very simple Spring ORM example that shows you how to configure an application ...

  9. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

最新文章

  1. [ADO.NET] 如何 使用 OLE DB 讀寫 Excel / 建立 Excel 檔案 (一)
  2. Py之jieba:Python包之jieba包(中文分词最好的组件)简介、安装、使用方法之详细攻略
  3. 转:WEB前端性能优化规则
  4. (Docker实战) 第4篇:Centos7 拉取和部署Redis
  5. 网管日志-06.07.24
  6. 各层电子数排布规则_干货 | 高中化学电子排布、第一电离能和电负性知识汇总...
  7. azure db 设置时区_将数据迁移到Azure Cosmos DB
  8. C++基础——类模板
  9. 工信部:2015年宽带城市20兆农村4兆
  10. 【空间分析】2 空间数据符号化
  11. 谷歌AI版“你画我猜”刷屏朋友圈 背后是这样的原理!
  12. 基于BP神经网络的含水率预测模型matlab仿真
  13. 耐心排序之最长递增子序列(LIS)
  14. 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,详细教您如何解决
  15. 困惑了很久的函数D3DXCreateTextureFromFileInMemoryEx
  16. Fatal error: Uncaught Error: Call to undefined function mysqli_content() in D:\phpstudy_pro\WWW\user
  17. github博客自动同步到gitee(保姆级教程)
  18. 【双足机器人(2)】倒立摆运动学模型构建(附代码)
  19. 生成Code128A,Code128B,Code128C,EAN128条码
  20. 联通TEWA 800改桥接

热门文章

  1. 有没有办法在Android上运行Python?
  2. g90舵机怎么一直在抖_抖音怎么带货?这样做抖音号,抖音小白也能月入10w
  3. 电脑自动关机什么原因?
  4. activiti流程变量
  5. python获取网页标题_Python2获取网页标题
  6. AT指令:AT+CPMS
  7. vivox6android版本5.1,vivo X6 Plus的手机系统是什么?能升级安卓5.0吗?
  8. json ajax查询,jQuery AJAX和JSON性能查询
  9. 洛谷——P1597 语句解析(两种解法)
  10. debian mysql目录_debian Squeeze配置apache php mysql环境,debian中apache目录结