SpringCache的介绍和使用
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的介绍和使用相关推荐
- Springboot整合redis(lettuce)
springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...
- SpringBoot 项目实战 ~ 9.数据缓存
和所有以梦为马的诗人一样 我选择永恒的事业 我的事业 就是要成为太阳的一生 - - 海子 一.环境搭建 1. 数据缓存的意义 由于移动端是面向所有的消费者的,请求压力相对比较大,而我们当前所有的数据查 ...
- 电商项目实战之缓存与Redis分布式锁
电商项目实战之缓存与Redis分布式锁 缓存失效 缓存穿透 缓存雪崩 缓存击穿 分布式缓存 分布式锁 SpringBoot整合Redisson实现分布式锁 实现过程 缓存和数据库一致性 场景分析 解决 ...
- SpringBoot交友APP项目实战(详细介绍+案例源码) - 9.小视频(SpringCache缓存)
有人相爱,有人跳海 系列文章目录 1. 项目介绍及环境配置 2. 短信验证码登录 3. 用户信息 4. MongoDB 5. 推荐好友列表/MongoDB集群/动态发布与查看 6. 圈子动态/圈子互动 ...
- Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来
计算机领域有人说过一句名言:"计算机科学领域的任何问题都可以通过增加一个中间层来解决",今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一 ...
- SpringBoot基础系列-SpringCache使用
原创文章,转载请标注出处:<SpringBoot基础系列-SpringCache使用> 一.概述 SpringCache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Sprin ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Springboot中的缓存Cache和CacheManager原理介绍
一.背景理解 什么是缓存,为什么要用缓存? 程序运行中,在内存保持一定时间不变的数据就是缓存.简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了.所以缓存并不是什么高大上的技术, ...
- spring-boot的spring-cache中的扩展redis缓存的ttl和key名
原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...
最新文章
- 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码
- KDD 2020 开源论文 | 稀疏优化的块分解算法
- java 多线程不安全_多线程并发为什么不安全
- 递归用函数、存储过程实现的效果
- 2019-03-09-算法-进化(买卖股票的最佳时机 II)
- 计算机教学难点重点,浅述如何解决小学信息技术教学中的重点、难点
- 因为项目管理知识体系指南(PMBOK)初识宝地
- mysql断了导致rabbitmq挂了,rabbitmq 消费线程无故中断连接
- 2021 年各家大厂的 AI Lab 现状如何?
- 德勤咨询:阿里云是跨国企业上云优选
- zookeeper的acl权限控制_zookeeper权限acl与四字命令
- 笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
- windows internals(深入解析windows操作系统)笔记
- isolate两三事
- 过支付宝反Xposed登录检测
- 关于背景图background-image
- [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET
- CSS 奇思妙想 | 巧妙的实现带圆角的三角形
- wireshark抓tcp三次握手四次挥手包
- 读《长尾理论》后感 by 克里斯.安德森 乔江涛译