Spring boot詳解緩存redis實(shí)現(xiàn)定時(shí)過(guò)期方法
前言
使用redis進(jìn)行緩存數(shù)據(jù),是目前比較常用的緩存解決方案。常用的緩存形式有一下幾種:
1.純?cè)a進(jìn)行redis的增刪改查,手工編寫(xiě)緩存工具類(lèi),由開(kāi)發(fā)者在代碼中進(jìn)行調(diào)用。
優(yōu)勢(shì):代碼由實(shí)際使用的開(kāi)發(fā)者進(jìn)行維護(hù),便于定制化的改造。
2.使用市場(chǎng)上已有的緩存工具,也就是大家常說(shuō)的大佬的輪子
優(yōu)勢(shì):方便快捷,提升開(kāi)發(fā)效率
添加依賴(lài)
修改pom文件引入如下配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.test</groupId> <artifactId>common-project</artifactId> <version>0.0.1-SNAPSHOT</version> <name>common-project</name> <description></description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.7</version> </dependency> </dependencies> </project>
添加配置
application.yml中增加redisd 配置信息
spring:
redis:
host: localhost
port: 6379
database: 0
password: *****
timeout: 10000
server:
port: 8082
常規(guī)緩存
在spring 3.1版本以后,注意是spring的版本,不是spring boot的版本。在spring-context包中合并進(jìn)去了spring Cache的內(nèi)容??梢允褂米⒔夥绞竭M(jìn)行緩存設(shè)定。
開(kāi)啟緩存
開(kāi)啟緩存只需要在入口函數(shù)上增加@EnableCaching注解
@SpringBootApplication @EnableCaching //開(kāi)啟緩存 public class CommonApplication { public static void main(String[] args) { SpringApplication.run(CommonApplication.class,args); } }
設(shè)置緩存空間
設(shè)置緩存空間可能大家不好理解,換一個(gè)通俗的說(shuō)法就是設(shè)置要緩存的類(lèi),把這個(gè)類(lèi)下面要緩存的數(shù)據(jù)的key加上一個(gè)統(tǒng)一的前綴,也是一個(gè)注解:@CacheConfig這里可以設(shè)置具體的值如下
@RestController @RequestMapping("/test") @CacheConfig(cacheNames = "test-controller") public class TestController { @Autowired TestService testService; @RequestMapping("/testCache") @Cacheable(key = "'testCache'",unless = "#result==null") public Object testCache(){ return testService.getUserInfoList(); } }
這里的cacheNames就是我上面說(shuō)的緩存空間,也許這樣還是沒(méi)辦法理解,請(qǐng)看在redis中的緩存情況:
就是說(shuō)如果我在TestController類(lèi)下設(shè)置的接口緩存數(shù)據(jù)都會(huì)緩存到test-controller這個(gè)緩存空間里。
設(shè)置緩存
這里就是指具體要緩存的接口數(shù)據(jù),使用注解:@Cacheable,具體代碼參見(jiàn)上面的代碼塊。
截止到這里,就可以啟動(dòng)服務(wù),調(diào)用接口,會(huì)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)可以緩存到redis中了。但是,這里有一個(gè)問(wèn)題,就是緩存下來(lái)的數(shù)據(jù),是永久緩存,一旦接口實(shí)際的數(shù)據(jù)有更新,只能通過(guò)再設(shè)置更新方法來(lái)更新緩存,或者刪除緩存,我們都知道redis本身是支持設(shè)置key的過(guò)期時(shí)間的,這一特性,讓緩存變得更加優(yōu)雅,所以我們的程序也要有?。?!
增加設(shè)置緩存過(guò)期時(shí)間
想要設(shè)置緩存過(guò)期時(shí)間,也并不是很麻煩,只是需要單獨(dú)增加一個(gè)redis的配置類(lèi),自定義修改一下緩存管理器就可以了
@Configuration public class RedisCacheManagerConfig { /** * redis模板配置以及序列化配置 * * @param factory 工廠 * @return {@link RedisTemplate}<{@link String}, {@link Object}> */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); //key 采用的String 的序列化方式 template.setKeySerializer(stringRedisSerializer); //hashde key 也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); //value 序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); //hash 的 value序列化方式采用jackson template.setHashKeySerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); template.afterPropertiesSet(); return template; } @Bean RedisCacheWriter writer(RedisTemplate<String, Object> redisTemplate) { return RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory())); } @Bean CacheManager cacheManager(RedisCacheWriter writer) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); Map<String, RedisCacheConfiguration> configurationMap = new HashMap<>(); // 配置序列化(解決亂碼的問(wèn)題) RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1))//time .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); //此處可以自定義緩存空間的緩存的過(guò)期時(shí)間,可以根據(jù)自己實(shí)際情況進(jìn)行設(shè)置,也可以不設(shè)置,用統(tǒng)一過(guò)期時(shí)間 configurationMap.put("test-controller", config.entryTtl(Duration.ofSeconds(200))); //解決查詢(xún)緩存轉(zhuǎn)換異常的問(wèn)題 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); return RedisCacheManager.builder(writer) .initialCacheNames(configurationMap.keySet()) .withInitialCacheConfigurations(configurationMap) //其他緩存空間緩存過(guò)期時(shí)間為500S .cacheDefaults(config.entryTtl(Duration.ofSeconds(500))) .build(); } }
增加了此配置類(lèi)之后,之前的代碼均不需要更改,直接啟動(dòng)程序,測(cè)試驗(yàn)證,可以看到redis中的數(shù)據(jù)是被設(shè)置了過(guò)期時(shí)間的
此處可能會(huì)有個(gè)意外驚喜(小坑):就是直接啟動(dòng)程序后,調(diào)用接口報(bào)錯(cuò),提示json格式轉(zhuǎn)換異常,這里是由于先前直接用的默認(rèn)的redisTemplate,value的反序列化問(wèn)題,可以將之前緩存的數(shù)據(jù)清理一下,再重新調(diào)用就可以了。
總結(jié)
注解方式進(jìn)行接口數(shù)據(jù)緩存,在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中比較常見(jiàn),我分享的這種方式也是大家比較常用的一種方式,配置簡(jiǎn)單,開(kāi)發(fā)成本低,使用方便。只需要:
- 引入依賴(lài)包
- 增加redis連接信息
- 開(kāi)啟緩存
- 添加需要緩存的類(lèi)或者方法
后記
這里題外記錄一下緩存注解中的一下參數(shù)含義及用法
另外設(shè)置緩存的注解中支持spEL表達(dá)式,下面是一些可用的表達(dá)式含義
到此這篇關(guān)于Spring boot詳解緩存redis實(shí)現(xiàn)定時(shí)過(guò)期方法的文章就介紹到這了,更多相關(guān)Spring boot定時(shí)過(guò)期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis定時(shí)監(jiān)控與數(shù)據(jù)處理的實(shí)踐指南
- Redis拓展之定時(shí)消息通知實(shí)現(xiàn)詳解
- Redis?延時(shí)任務(wù)實(shí)現(xiàn)及與定時(shí)任務(wù)區(qū)別詳解
- Redis定時(shí)任務(wù)原理的實(shí)現(xiàn)
- Python定時(shí)從Mysql提取數(shù)據(jù)存入Redis的實(shí)現(xiàn)
- Spring Boot監(jiān)聽(tīng)Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例
- 基于redis實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
- Springboot使用Redis實(shí)現(xiàn)定時(shí)任務(wù)的三種方式
相關(guān)文章
Spring boot2+jpa+thymeleaf實(shí)現(xiàn)增刪改查
這篇文章主要介紹了Spring boot2+jpa+thymeleaf實(shí)現(xiàn)增刪改查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot+Redis防止惡意刷新與暴力請(qǐng)求接口的實(shí)現(xiàn)
這篇文章主要為大家介紹了如何利用springboot和Redis來(lái)實(shí)現(xiàn)防止惡意刷新與暴力請(qǐng)求接口,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06Java創(chuàng)建線程池的方式實(shí)現(xiàn)
本文主要介紹了創(chuàng)建線程池的方式,包括三種方式,第一種是使用Executors框架,第二種是使用ThreadPoolExecutor,第三種是使用ForkJoinPool,感興趣的可以了解一下2024-12-12java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時(shí)間序列化
本篇文章主要介紹了java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時(shí)間序列化,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)
前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預(yù)覽功能打開(kāi),本文就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-09-09mybatis plus開(kāi)發(fā)過(guò)程中遇到的問(wèn)題記錄及解決
這篇文章主要介紹了mybatis plus開(kāi)發(fā)過(guò)程中遇到的問(wèn)題記錄及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Spring關(guān)閉Tomcat Servlet容器時(shí)內(nèi)存泄漏問(wèn)題解決方案
這篇文章主要介紹了Spring關(guān)閉Tomcat Servlet容器時(shí)內(nèi)存泄漏問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10springBoot集成redis的key,value序列化的相關(guān)問(wèn)題
這篇文章主要介紹了springBoot集成redis的key,value序列化的相關(guān)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08