1.简介

1)Spring 从 3.1 开始定义了 org.springframework.cache.Cache和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术;
并支持使用 JCache(JSR-107)注解简化我们开发;

2)每次调用需要缓存功能的方法时,Spring 会检查检查指定参数的指定的目标方法是否已
经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓
存结果后返回给用户。下次调用直接从缓存中获取。

这些介绍,大家看看就行了,我们主要如何使用它

2.基本概念图

3.常用注解

@EnableCaching:主方法中标注,表示开启缓存注解功能

@Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中

@CachePut:也是将方法的返回结果放入到缓存中,和 @Cacheable 不同的是,它每次都会触发真实方法的调用,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

@CacheEvict:删除缓存

@Caching:组合以上多个操作的

4.使用

1)导入依赖

        <!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--springcache依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>

2)相关配置

application.properties

spring.cache.type=redis#spring.cache.cache-names=qq,毫秒为单位
spring.cache.redis.time-to-live=3600000#如果指定了前缀就用我们指定的前缀,如果没有就默认使用缓存的名字作为前缀
#spring.cache.redis.key-prefix=CACHE_
spring.cache.redis.use-key-prefix=true#是否缓存空值,防止缓存穿透
spring.cache.redis.cache-null-values=true

 MyCachingConfig:

/*** springcach配置*/
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
public class MyCacheConfig {//    @Autowired
//    CacheProperties cacheProperties;/*** 需要将配置文件中的配置设置上* 1、使配置类生效* 1)开启配置类与属性绑定功能EnableConfigurationProperties** @ConfigurationProperties(prefix = "spring.cache")  public class CacheProperties* 2)注入就可以使用了* @Autowired CacheProperties cacheProperties;* 3)直接在方法参数上加入属性参数redisCacheConfiguration(CacheProperties redisProperties)* 自动从IOC容器中找* <p>* 2、给config设置上*/@BeanRedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// 当自己往IOC注入了RedisCacheConfiguration配置类时,以下参数全都失效,需要手动设置CacheProperties.Redis redisProperties = cacheProperties.getRedis();if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}
}

@EnableCaching:

@Cacheable

/***  key是默认生成的:缓存的名字::SimpleKey::[](自动生成key值)*  缓存的value值,默认使用jdk序列化机制,将序列化的数据存到redis中*  默认时间是 -1* @return*    自定义操作:key的生成*  1. 指定生成缓存的key:key属性指定,接收一个 SpEl,关于SpEl的写法,可以查看Cacheable注解的注释或官方文档,*  2. 指定缓存的数据的存活时间:配置文档中修改存活时间 ttl (配置文件已设置)*  3. 将数据保存为json格式: 自定义配置类 MyCacheManager (配置文件已设置)*  4.如果key想要设置为字符需要这样写:key=”‘内容’“*  5.下面的category是分区名(就是有很多种类的缓存,比如品牌的,分类的等)*  6.下面的key是缓存的名字*/@Cacheable(value ="category",key = "#root.methodName")@Overridepublic Map<String, List<Catelog2Vo>> getCatalogJson() {List<CategoryEntity> list = this.list(null);//查出一级菜单List<CategoryEntity> categorys = this.list(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));Map<String, List<Catelog2Vo>> collect1 = categorys.stream().collect(Collectors.toMap((k) -> {return k.getCatId().toString();}, (v) -> {List<CategoryEntity> categoryEntity2 = getParent_cid(list, v.getCatId());List<Catelog2Vo> catelog2Vos = categoryEntity2.stream().map((obj) -> {Catelog2Vo catelog2Vo = new Catelog2Vo();catelog2Vo.setCatalog1Id(v.getCatId().toString());catelog2Vo.setId(obj.getCatId().toString());catelog2Vo.setName(obj.getName());List<CategoryEntity> catelog3Vo = getParent_cid(list, obj.getParentCid());List<Catelog2Vo.Catalog3Vo> collect = catelog3Vo.stream().map((vo3) -> {Catelog2Vo.Catalog3Vo catelo3Vo = new Catelog2Vo.Catalog3Vo();catelo3Vo.setName(vo3.getName());catelo3Vo.setId(vo3.getCatId().toString());catelo3Vo.setCatalog2Id(obj.getCatId().toString());return catelo3Vo;}).collect(Collectors.toList());catelog2Vo.setCatalog3List(collect);return catelog2Vo;}).collect(Collectors.toList());return catelog2Vos;}));return collect1;}

缓存结果:

CachePut:这个注解的使用和Cacheable的差不多,要注意他们的区别

@CacheEvict:删除category分区下的key为getCatalogJson,一般使用在修改方法,注意单引号

 @Caching

举个例子。我们要删除category分区下的key为one和key为two的两个key,怎么办呢?

第一种写法:

第二种写法:注意这是删除category分区下的所有key

希望对你有帮助,有问题私信一起交流!

SpringCache的介绍和使用相关推荐

  1. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

  2. SpringBoot 项目实战 ~ 9.数据缓存

    和所有以梦为马的诗人一样 我选择永恒的事业 我的事业 就是要成为太阳的一生 - - 海子 一.环境搭建 1. 数据缓存的意义 由于移动端是面向所有的消费者的,请求压力相对比较大,而我们当前所有的数据查 ...

  3. 电商项目实战之缓存与Redis分布式锁

    电商项目实战之缓存与Redis分布式锁 缓存失效 缓存穿透 缓存雪崩 缓存击穿 分布式缓存 分布式锁 SpringBoot整合Redisson实现分布式锁 实现过程 缓存和数据库一致性 场景分析 解决 ...

  4. SpringBoot交友APP项目实战(详细介绍+案例源码) - 9.小视频(SpringCache缓存)

    有人相爱,有人跳海 系列文章目录 1. 项目介绍及环境配置 2. 短信验证码登录 3. 用户信息 4. MongoDB 5. 推荐好友列表/MongoDB集群/动态发布与查看 6. 圈子动态/圈子互动 ...

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

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

  6. SpringBoot基础系列-SpringCache使用

    原创文章,转载请标注出处:<SpringBoot基础系列-SpringCache使用> 一.概述 SpringCache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Sprin ...

  7. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  8. Springboot中的缓存Cache和CacheManager原理介绍

    一.背景理解 什么是缓存,为什么要用缓存? 程序运行中,在内存保持一定时间不变的数据就是缓存.简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了.所以缓存并不是什么高大上的技术, ...

  9. spring-boot的spring-cache中的扩展redis缓存的ttl和key名

    原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...

最新文章

  1. 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码
  2. KDD 2020 开源论文 | 稀疏优化的块分解算法
  3. java 多线程不安全_多线程并发为什么不安全
  4. 递归用函数、存储过程实现的效果
  5. 2019-03-09-算法-进化(买卖股票的最佳时机 II)
  6. 计算机教学难点重点,浅述如何解决小学信息技术教学中的重点、难点
  7. 因为项目管理知识体系指南(PMBOK)初识宝地
  8. mysql断了导致rabbitmq挂了,rabbitmq 消费线程无故中断连接
  9. 2021 年各家大厂的 AI Lab 现状如何?
  10. 德勤咨询:阿里云是跨国企业上云优选
  11. zookeeper的acl权限控制_zookeeper权限acl与四字命令
  12. 笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
  13. windows internals(深入解析windows操作系统)笔记
  14. isolate两三事
  15. 过支付宝反Xposed登录检测
  16. 关于背景图background-image
  17. [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET
  18. CSS 奇思妙想 | 巧妙的实现带圆角的三角形
  19. wireshark抓tcp三次握手四次挥手包
  20. 读《长尾理论》后感 by 克里斯.安德森 乔江涛译

热门文章

  1. DAC8760 菊花链驱动
  2. 鸿蒙九彩经三月的小雨的,三月的小雨心情随笔
  3. camera capture
  4. 10分钟学会树莓派3B+图像边缘识别OpenCV3.3.1+QT5
  5. python 知乎登录_python3模拟知乎登录
  6. 能让你笑出八块腹肌的内涵手游|Cocos强势围观
  7. Patch Winrar 广告弹窗
  8. 大(json)文件压缩(minify)
  9. Android仿淘宝历史搜索效果
  10. 两位数乘法的速算方法(三)