最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot詳解緩存redis實現(xiàn)定時過期方法

 更新時間:2022年07月12日 09:33:59   作者:鄭小白  
本篇文章分享的就是spring boot中的一個輪子,spring cache注解的方式實現(xiàn)接口數(shù)據(jù)緩存。默認的配置想非常簡單,但是有一個弊端是緩存數(shù)據(jù)為永久緩存,本次將介紹如何設置接口緩存數(shù)據(jù)的過期時間

前言

使用redis進行緩存數(shù)據(jù),是目前比較常用的緩存解決方案。常用的緩存形式有一下幾種:

1.純原生代碼進行redis的增刪改查,手工編寫緩存工具類,由開發(fā)者在代碼中進行調(diào)用。

優(yōu)勢:代碼由實際使用的開發(fā)者進行維護,便于定制化的改造。

2.使用市場上已有的緩存工具,也就是大家常說的大佬的輪子

優(yōu)勢:方便快捷,提升開發(fā)效率

添加依賴

修改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包中合并進去了spring Cache的內(nèi)容??梢允褂米⒔夥绞竭M行緩存設定。

開啟緩存

開啟緩存只需要在入口函數(shù)上增加@EnableCaching注解

@SpringBootApplication
@EnableCaching //開啟緩存
public class CommonApplication {
    public static void main(String[] args) {
        SpringApplication.run(CommonApplication.class,args);
    }
}

設置緩存空間

設置緩存空間可能大家不好理解,換一個通俗的說法就是設置要緩存的類,把這個類下面要緩存的數(shù)據(jù)的key加上一個統(tǒng)一的前綴,也是一個注解:@CacheConfig這里可以設置具體的值如下

@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就是我上面說的緩存空間,也許這樣還是沒辦法理解,請看在redis中的緩存情況:

就是說如果我在TestController類下設置的接口緩存數(shù)據(jù)都會緩存到test-controller這個緩存空間里。

設置緩存

這里就是指具體要緩存的接口數(shù)據(jù),使用注解:@Cacheable,具體代碼參見上面的代碼塊。

截止到這里,就可以啟動服務,調(diào)用接口,會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)可以緩存到redis中了。但是,這里有一個問題,就是緩存下來的數(shù)據(jù),是永久緩存,一旦接口實際的數(shù)據(jù)有更新,只能通過再設置更新方法來更新緩存,或者刪除緩存,我們都知道redis本身是支持設置key的過期時間的,這一特性,讓緩存變得更加優(yōu)雅,所以我們的程序也要有?。?!

增加設置緩存過期時間

想要設置緩存過期時間,也并不是很麻煩,只是需要單獨增加一個redis的配置類,自定義修改一下緩存管理器就可以了

@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<>();
        // 配置序列化(解決亂碼的問題)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1))//time
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        //此處可以自定義緩存空間的緩存的過期時間,可以根據(jù)自己實際情況進行設置,也可以不設置,用統(tǒng)一過期時間
        configurationMap.put("test-controller", config.entryTtl(Duration.ofSeconds(200)));
        //解決查詢緩存轉換異常的問題
        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)
                //其他緩存空間緩存過期時間為500S
                .cacheDefaults(config.entryTtl(Duration.ofSeconds(500)))
                .build();
    }
}

增加了此配置類之后,之前的代碼均不需要更改,直接啟動程序,測試驗證,可以看到redis中的數(shù)據(jù)是被設置了過期時間的

此處可能會有個意外驚喜(小坑):就是直接啟動程序后,調(diào)用接口報錯,提示json格式轉換異常,這里是由于先前直接用的默認的redisTemplate,value的反序列化問題,可以將之前緩存的數(shù)據(jù)清理一下,再重新調(diào)用就可以了。

總結

注解方式進行接口數(shù)據(jù)緩存,在實際項目開發(fā)過程中比較常見,我分享的這種方式也是大家比較常用的一種方式,配置簡單,開發(fā)成本低,使用方便。只需要:

  1. 引入依賴包
  2. 增加redis連接信息
  3. 開啟緩存
  4. 添加需要緩存的類或者方法

后記

這里題外記錄一下緩存注解中的一下參數(shù)含義及用法

另外設置緩存的注解中支持spEL表達式,下面是一些可用的表達式含義

到此這篇關于Spring boot詳解緩存redis實現(xiàn)定時過期方法的文章就介紹到這了,更多相關Spring boot定時過期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查

    Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查

    這篇文章主要介紹了Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java基礎之如何學好Java

    Java基礎之如何學好Java

    這篇文章已經(jīng)是有數(shù)年“網(wǎng)齡”的老文,不過在今天看來仍然經(jīng)典。如何學習java?本篇文章可以說也是面對編程初學者的一篇指導文章,其中對于如何學習Java的步驟的介紹,很多也適用于開發(fā)領域其他技能的學習。
    2014-10-10
  • SpringBoot+Redis防止惡意刷新與暴力請求接口的實現(xiàn)

    SpringBoot+Redis防止惡意刷新與暴力請求接口的實現(xiàn)

    這篇文章主要為大家介紹了如何利用springboot和Redis來實現(xiàn)防止惡意刷新與暴力請求接口,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • Java反射技術詳解

    Java反射技術詳解

    這篇文章主要結合實例形式分析了介紹了Java反射技術,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • Java創(chuàng)建線程池的方式實現(xiàn)

    Java創(chuàng)建線程池的方式實現(xiàn)

    本文主要介紹了創(chuàng)建線程池的方式,包括三種方式,第一種是使用Executors框架,第二種是使用ThreadPoolExecutor,第三種是使用ForkJoinPool,感興趣的可以了解一下
    2024-12-12
  • java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    本篇文章主要介紹了java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Java后端返回PDF預覽給前端的實現(xiàn)

    Java后端返回PDF預覽給前端的實現(xiàn)

    前端要預覽服務器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預覽功能打開,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下
    2023-09-09
  • mybatis plus開發(fā)過程中遇到的問題記錄及解決

    mybatis plus開發(fā)過程中遇到的問題記錄及解決

    這篇文章主要介紹了mybatis plus開發(fā)過程中遇到的問題記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring關閉Tomcat Servlet容器時內(nèi)存泄漏問題解決方案

    Spring關閉Tomcat Servlet容器時內(nèi)存泄漏問題解決方案

    這篇文章主要介紹了Spring關閉Tomcat Servlet容器時內(nèi)存泄漏問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • springBoot集成redis的key,value序列化的相關問題

    springBoot集成redis的key,value序列化的相關問題

    這篇文章主要介紹了springBoot集成redis的key,value序列化的相關問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論

锡林郭勒盟| 皮山县| 牙克石市| 阿拉善左旗| 涿鹿县| 闵行区| 卫辉市| 漯河市| 冕宁县| 华容县| 军事| 平阴县| 美姑县| 义马市| 铜川市| 呼玛县| 邵阳市| 长乐市| 涿州市| 额尔古纳市| 枞阳县| 石首市| 洛宁县| 泽普县| 洛扎县| 赤壁市| 泗洪县| 义马市| 崇州市| 吴桥县| 鄂尔多斯市| 宾阳县| 大连市| 石林| 瑞金市| 博爱县| 嘉禾县| 湖南省| 名山县| 临颍县| 靖远县|