SpringCache与Redis
文章目录
- SpringCache简介
- 常⽤注解Cacheable
- 自定义CacheManager配置和过期时间
- 自定义缓存KeyGenerator
- 常用注解CachePut 和 CacheEvict
- 多注解组合Caching
SpringCache简介
⽂档:https://spring.io/guides/gs/caching/
⾃Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache⽀持,且提供了Cache抽象提供基本的Cache抽象,⽅便切换各种底层Cache只需要更少的代码就可以完成业务数据的缓存提供事务回滚时也⾃动回滚缓存,⽀持⽐较复杂的缓存逻辑
核⼼
⼀个是Cache接⼝,缓存操作的API
⼀个是CacheManager管理各类缓存,有多个缓存
项⽬中引⼊starter依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置⽂件指定缓存类型
spring:cache:type: redis
启动类开启缓存注解
@EnableCaching
常⽤注解Cacheable
标记在⼀个⽅法上,也可以标记在⼀个类上缓存标注对象的返回结果,标注在⽅法上缓存该⽅法的返回值,标注在类上缓存该类所有的⽅法返回值value 缓存名称,可以有多个key 缓存的key规则,可以⽤springEL表达式,默认是⽅法参数组合
condition 缓存条件,使⽤springEL编写,返回true才缓存
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.xdclass.xdclassredis.dao.ProductMapper;
import net.xdclass.xdclassredis.model.ProductDO;
import net.xdclass.xdclassredis.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Override@Cacheable(value = {"product"},key = "#root.args[0]")public ProductDO findById(int id) {return productMapper.selectById(id);}@Override@Cacheable(value = {"product_page"},key = "#root.methodName+'_'+#page+'_'+#size")public Map<String, Object> page(int page, int size) {Page pageInfo = new Page<>(page,size);IPage<ProductDO> iPage = productMapper.selectPage(pageInfo,null);Map<String,Object> pageMap = new HashMap<>(3);pageMap.put("total_record",iPage.getTotal());pageMap.put("total_page",iPage.getPages());pageMap.put("current_data",iPage.getRecords());return pageMap;}}
自定义CacheManager配置和过期时间
默认为@Primary注解所标注的CacheManager
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.StringUtils;import java.lang.reflect.Method;
import java.time.Duration;@Configuration
public class AppConfiguration {/*** 新的分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}/*** 1分钟过期** @param connectionFactory* @return*/@Beanpublic RedisCacheManager cacheManager1Minute(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration config = instanceConfig(60L);return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();}/*** 默认是1小时** @param connectionFactory* @return*/@Bean@Primarypublic RedisCacheManager cacheManager1Hour(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration config = instanceConfig(3600L);return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();}/*** 1天过期** @param connectionFactory* @return*/@Beanpublic RedisCacheManager cacheManager1Day(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration config = instanceConfig(3600 * 24L);return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();}private RedisCacheConfiguration instanceConfig(Long ttl) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);objectMapper.registerModule(new JavaTimeModule());// 去掉各种@JsonSerialize注解的解析objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);// 只针对非空的值进行序列化objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// 将类型序列化到属性json字符串中objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(ttl))//.disableCachingNullValues().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));}}
自定义缓存KeyGenerator
@Configuration
public class AppConfiguration {/*** 自定义缓存key规则* @return*/@Beanpublic KeyGenerator springCacheCustomKeyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object o, Method method, Object... objects) {String key = o.getClass().getSimpleName() + "_" + method.getName() + "_" + StringUtils.arrayToDelimitedString(objects, "_");System.out.println(key);return key;}};}}
key 属性和keyGenerator属性只能⼆选⼀
CacheManager和keyGenerator使用
@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Override@Cacheable(value = {"product"}, keyGenerator = "springCacheCustomKeyGenerator",cacheManager = "cacheManager1Minute")public ProductDO findById(int id) {return productMapper.selectById(id);}@Override@Cacheable(value = {"product_page"},keyGenerator = "springCacheCustomKeyGenerator")public Map<String, Object> page(int page, int size) {Page pageInfo = new Page<>(page,size);IPage<ProductDO> iPage = productMapper.selectPage(pageInfo,null);Map<String,Object> pageMap = new HashMap<>(3);pageMap.put("total_record",iPage.getTotal());pageMap.put("total_page",iPage.getPages());pageMap.put("current_data",iPage.getRecords());return pageMap;}}
常用注解CachePut 和 CacheEvict
CachePut
根据方法的请求参数对其结果进行缓存,每次都会触发真实⽅法的调⽤value 缓存名称,可以有多个key 缓存的key规则,可以⽤springEL表达式,默认是⽅法参数组合condition 缓存条件,使⽤springEL编写,返回true才缓存
CacheEvict
从缓存中移除相应数据, 触发缓存删除的操作value 缓存名称,可以有多个@CachePut(value = {“product”},key =
“#productDO.id”)key 缓存的key规则,可以⽤springEL表达式,默认是⽅法参数组合
beforeInvocation = false
缓存的清除是否在⽅法之前执⾏ ,默认代表缓存清除操作是在⽅法执⾏之后执⾏,如果出现异常缓存就不会清除
beforeInvocation = true
代表清除缓存操作是在⽅法运⾏之前执⾏,⽆论⽅法是否出现异常,缓存都清除
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.xdclass.xdclassredis.dao.ProductMapper;
import net.xdclass.xdclassredis.model.ProductDO;
import net.xdclass.xdclassredis.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Override@CacheEvict(value = {"product"},key = "#root.args[0]")public int delById(int id) {return productMapper.deleteById(id);}@Override@CachePut(value = {"product"},key="#productDO.id", cacheManager = "cacheManager1Minute")public ProductDO updateById(ProductDO productDO) {productMapper.updateById(productDO);return productDO;}
多注解组合Caching
组合多个Cache注解使⽤,允许在同⼀⽅法上使⽤多个嵌套的@Cacheable、@CachePut和@CacheEvict注释
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.xdclass.xdclassredis.dao.ProductMapper;
import net.xdclass.xdclassredis.model.ProductDO;
import net.xdclass.xdclassredis.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Override@Caching(cacheable = {@Cacheable(value = {"product"},key = "#root.args[0]"),@Cacheable(value = {"product"},key = "'xdclass_'+#root.args[0]")},put = {@CachePut(value = {"product_test"},key="#id", cacheManager = "cacheManager1Minute")})public ProductDO findById(int id) {return productMapper.selectById(id);}}
SpringCache与Redis相关推荐
- SpringCache与redis集成,优雅的缓存解决方案
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/chenkeyu/p/8028781 ...
- SpringCache 集成 Redis,这才是优雅的缓存解决方案!
缓存可以说是加速服务响应速度的一种非常有效并且简单的方式.在缓存领域,有很多知名的框架,如EhCache .Guava.HazelCast等. Redis作为key-value型数据库,由于他的这一特 ...
- SpringBoot2.0整合SpringCache和Redis(lettuce)攻略
Redis Redis 是一个高性能的key-value数据库,广泛应用于互联网业务的缓存,如token池,商品缓存等等热点数据的缓存. linux原版官方地址 http://redis.io win ...
- redis命令,SpringBoot整合Redis6,主从复制,哨兵模式,集群,springCache初高级应用。
目录 1. Docker安装Redis 2. Redis的基础 2.1 redis的key命令 2.2 reids的数据结构(6.0新增的数据结构) 1. String(字符串)类型 2. List( ...
- Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来
计算机领域有人说过一句名言:"计算机科学领域的任何问题都可以通过增加一个中间层来解决",今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一 ...
- data spring 指定时区_今天的工作内容:Spring Boot 2.X整合Spring-cache
计算机领域有人说过一句名言:"计算机科学领域的任何问题都可以通过增加一个中间层来解决",今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一 ...
- Java开发 - SpringCache初体验
前言 早些时候,博主介绍过Redis的使用:Java开发 - Redis初体验,Redie是基于缓存的一项技术,对于Redis,博主此处不再赘述,不了解的可以去看这篇文章,但Redis缓存并不是顶峰, ...
- 关于java.lang.NumberFormatException: For input string:${redis.maxIdle}的报错
项目通用文件配置目录 reids配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- Redis讲解(纯洁的微笑)
Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,spring-boot-starter-data-redis依赖于spring ...
最新文章
- Java锁机制学习笔记——synchronized 和 Lock
- 如何在Simulink中添加延迟环节
- Mysql中group by 使用中发现的问题
- [Vue.js] 基础 -- 安装Vue
- setuptools Distributing a setuptools-based project
- 项目中出现specify @BootstrapWith‘s ‘value‘ attribute or make the default bootstrapper class avail
- c++ 调用windows tts_有关调用约定的历史 – 第三部分
- IOS 高德地图导航
- Qt5-将手机上B站下载的视频提取到到电脑上并批量移动到指定文件夹和重命名
- BP神经网络回归预测模型(python实现)
- java审批工作流,值得一读!
- iOS 斯坦福大学公开课地址
- 微信小程序最简单的轮播图
- 【IIS小技巧】将IIS Express改成可以通过ip地址访问
- android 图片的处理方法,Android图片处理,ImageView的属性和方法大全
- PS制作一寸照片具体过程
- 串口屏之------Usart GPU 使用手册
- 软件质量保证与测试技术实验报告(三)静态测试
- 羽毛球业余分级新标准
- 用服务器的id做网站,用服务器做网站空间
热门文章
- linux 的网络操作与配置文件,Linux常用文件与网络操作命令速记指南
- python中类变量的访问方式_在Python中,如何访问类方法中的“静态”类变量
- c++ 多核cpu序列号_关于 CPU 的一些基本知识总结
- 经典排序算法(11)——计数排序算法详解
- 【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】
- Codeforces Round #516 (Div. 2Div.1)
- 计算几何模板中的代码
- P1972 [SDOI2009]HH的项链
- CF 1529C Parsa‘s Humongous Tree
- 牛客题霸 [最大数] C++题解/答案