版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Springboot详解缓存redis实现定时过期方法目录前言添加依赖添加配置常规缓存开启缓存设置缓存空间设置缓存增加设置缓存过期时间总结后记
前言
使用redis进行缓存数据,是目前比较常用的缓存解决方案。常用的缓存形式有一下几种:
1.纯原生代码进行redis的增删改查,手工编写缓存工具类,由开发者在代码中进行调用。
优势:代码由实际使用的开发者进行维护,便于定制化的改造。
2.使用市场上已有的缓存工具,也就是大家常说的大佬的轮子
优势:方便快捷,提升开发效率
添加依赖
修改pom文件引入如下配置
xmlversion="1.0"encoding="UTF-8"
projectxmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd"
modelVersion4.0.0/modelVersion
parent
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-parent/artifactId
version2.7.0/version
relativePath/!--lookupparentfromrepository--
/parent
groupIdcom.test/groupId
artifactIdcommon-project/artifactId
version0.0.1-SNAPSHOT/version
namecommon-project/name
description/description
properties
java.version1.8/java.version
/properties
dependencies
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter/artifactId
/dependency
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-data-redis/artifactId
/dependency
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-web/artifactId
/dependency
dependency
groupIdjectlombok/groupId
artifactIdlombok/artifactId
version1.18.24/version
/dependency
dependency
groupIdcom.alibaba/groupId
artifactIdfastjson/artifactId
version2.0.7/version
/dependency
/dependencies
/project
添加配置
application.yml中增加redisd配置信息
spring:
redis:
host:localhost
port:6379
database:0
password:*****
timeout:10000
server:
port:8082
常规缓存
在spring3.1版本以后,注意是spring的版本,不是springboot的版本。在spring-context包中合并进去了springCache的内容。可以使用注解方式进行缓存设定。
开启缓存
开启缓存只需要在入口函数上增加@EnableCaching注解
@SpringBootApplication
@EnableCaching//开启缓存
publicclassCommonApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(CommonApplication.class,args);
}
设置缓存空间
设置缓存空间可能大家不好理解,换一个通俗的说法就是设置要缓存的类,把这个类下面要缓存的数据的key加上一个统一的前缀,也是一个注解:@CacheConfig这里可以设置具体的值如下
@RestController
@RequestMapping("/test")
@CacheConfig(cacheNames="test-controller")
publicclassTestController{
@Autowired
TestServicetestService;
@RequestMapping("/testCache")
@Cacheable(key="'testCache'",unless="#result==null")
publicObjecttestCache(){
returntestService.getUserInfoList();
}
这里的cacheNames就是我上面说的缓存空间,也许这样还是没办法理解,请看在redis中的缓存情况:
就是说如果我在TestController类下设置的接口缓存数据都会缓存到test-controller这个缓存空间里。
设置缓存
这里就是指具体要缓存的接口数据,使用注解:@Cacheable,具体代码参见上面的代码块。
截止到这里,就可以启动服务,调用接口,会发现数据已经可以缓存到redis中了。但是,这里有一个问题,就是缓存下来的数据,是永久缓存,一旦接口实际的数据有更新,只能通过再设置更新方法来更新缓存,或者删除缓存,我们都知道redis本身是支持设置key的过期时间的,这一特性,让缓存变得更加优雅,所以我们的程序也要有!!!
增加设置缓存过期时间
想要设置缓存过期时间,也并不是很麻烦,只是需要单独增加一个redis的配置类,自定义修改一下缓存管理器就可以了
@Configuration
publicclassRedisCacheManagerConfig{
*redis模板配置以及序列化配置
*@paramfactory工厂
*@return{@linkRedisTemplate}{@linkString},{@linkObject}
@Bean
publicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryfactory){
RedisTemplateString,Objecttemplate=newRedisTemplate();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
ObjectMapperom=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();
//key采用的String的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hashdekey也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化方式采用jackson
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
template.afterPropertiesSet();
returntemplate;
@Bean
RedisCacheWriterwriter(RedisTemplateString,ObjectredisTemplate){
returnRedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
@Bean
CacheManagercacheManager(RedisCacheWriterwriter){
RedisSerializerStringredisSerializer=newStringRedisSerializer();
Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
MapString,RedisCacheConfigurationconfigurationMap=newHashMap();
//配置序列化(解决乱码的问题)
RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))//time
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
//此处可以自定义缓存空间的缓存的过期时间,可以根据自己实际情况进行设置,也可以不设置,用统一过期时间
configurationMap.put("test-controller",config.entryTtl(Duration.ofSeconds(200)));
//解决查询缓存转换异常的问题
ObjectMapperom=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论