Spring boot详解缓存redis实现定时过期方法

目录
  • 前言
  • 添加依赖
  • 添加配置
  • 常规缓存
  • 开启缓存
  • 设置缓存空间
  • 设置缓存
  • 增加设置缓存过期时间
  • 总结
  • 后记

前言

使用redis进行缓存数据,是目前比较常用的缓存解决方案。常用的缓存形式有一下几种:

1.纯原生代码进行redis的增删改查,手工编写缓存工具类,由开发者在代码中进行调用。

优势:代码由实际使用的开发者进行维护,便于定制化的改造。

2.使用市场上已有的缓存工具,也就是大家常说的大佬的轮子

优势:方便快捷,提升开发效率

添加依赖

修改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

常规缓存

在spring 3.1版本以后,注意是spring的版本,不是spring boot的版本。在spring-context包中合并进去了spring Cache的内容。可以使用注解方式进行缓存设定。

开启缓存

开启缓存只需要在入口函数上增加@EnableCaching注解

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

设置缓存空间

设置缓存空间可能大家不好理解,换一个通俗的说法就是设置要缓存的类,把这个类下面要缓存的数据的key加上一个统一的前缀,也是一个注解:@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类下设置的接口缓存数据都会缓存到test-controller这个缓存空间里。

设置缓存

这里就是指具体要缓存的接口数据,使用注解:@Cacheable,具体代码参见上面的代码块。

截止到这里,就可以启动服务,调用接口,会发现数据已经可以缓存到redis中了。但是,这里有一个问题,就是缓存下来的数据,是永久缓存,一旦接口实际的数据有更新,只能通过再设置更新方法来更新缓存,或者删除缓存,我们都知道redis本身是支持设置key的过期时间的,这一特性,让缓存变得更加优雅,所以我们的程序也要有!!!

增加设置缓存过期时间

想要设置缓存过期时间,也并不是很麻烦,只是需要单独增加一个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();
        //此处可以自定义缓存空间的缓存的过期时间,可以根据自己实际情况进行设置,也可以不设置,用统一过期时间
        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中的数据是被设置了过期时间的

此处可能会有个意外惊喜(小坑):就是直接启动程序后,调用接口报错,提示json格式转换异常,这里是由于先前直接用的默认的redisTemplate,value的反序列化问题,可以将之前缓存的数据清理一下,再重新调用就可以了。

总结

注解方式进行接口数据缓存,在实际项目开发过程中比较常见,我分享的这种方式也是大家比较常用的一种方式,配置简单,开发成本低,使用方便。只需要:

  1. 引入依赖包
  2. 增加redis连接信息
  3. 开启缓存
  4. 添加需要缓存的类或者方法

后记

这里题外记录一下缓存注解中的一下参数含义及用法

另外设置缓存的注解中支持spEL表达式,下面是一些可用的表达式含义

到此这篇关于Spring boot详解缓存redis实现定时过期方法的文章就介绍到这了,更多相关Spring boot定时过期内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Boot示例代码整合Redis详解

    目录 Redis 简介 Redis 优势 Redis与其他key-value存储有什么不同 添加Redis依赖包 配置Redis数据库连接 编写Redis操作工具类 测试 Redis 简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据

  • SpringBoot详解整合Spring Cache实现Redis缓存流程

    目录 1.简介 2.常用注解 2.1.@EnableCaching 2.2.@Cacheable 2.3.@CachePut 2.4.@CacheEvict 3.使用Redis当作缓存产品 3.1.坐标导入 3.2.yml配置 3.3.开启注解功能 3.4.使用@Cacheable 3.5.使用@CacheEvict 4.测试 1.简介 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache 提供了一层抽象,底层可以切

  • SpringBoot Redis用注释实现接口限流详解

    目录 1. 准备工作 2. 限流注解 3. 定制 RedisTemplate 4. 开发 Lua 脚本 5. 注解解析 6. 接口测试 7. 全局异常处理 1. 准备工作 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下: <dependency> <groupId>org.springframework.boot</g

  • springboot整合redis之消息队列

    目录 一.项目准备 二.配置类 三.redis中list数据类型 定时器监听队列 运行即监控队列 四.发布/订阅模式 五.ZSet实现延迟队列 一.项目准备 依赖 <!-- RedisTemplate --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &

  • Spring Boot监听Redis Key失效事件实现定时任务的示例

    业务场景 我们以订单功能为例说明下: 生成订单后一段时间不支付订单会自动关闭.最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率. 还有一种想法,在用户进入订单界面的时候,判断时间执行相关操作.方式可能有很多,在这里介绍一种监听 Redis 键值对过期时间来实现订单自动关闭. 实现思路 在生成订单时,向 Redis 中增加一个 KV 键值对,K 为订单号,保证通过 K 能定位到数据库中的某个订单即可,V 可为任意值

  • springboot使用redis的详细步骤

    目录 springboot使用redis springboot使用redis步骤 StringRedisTemplate和RedisTemplate 总结 springboot使用redis redis-service.exe : 服务端,启动后不要关闭 redis-cli.exe : 客户端,访问redis中的数据 redisclient-win32.x86_64.2.0.jar : redis的图形界面客户端,执行方式是在这个文件的目录执行 java -jar redisclient-win

  • springboot 集成redis哨兵主从的实现

    目录 一.环境 二.POM文件 三.application.yml配置 四.reidsTemplate配置 五.单元测试(JUnit4) 一.环境 spring boot 2.3.12.RELEASEJDK 1.8IntelliJ IDEA开发工具Redis哨兵主从搭建 二.POM文件 pom文件其他忽略,只展示和redis有关系统的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif

  • SpringBoot详解如何整合Redis缓存验证码

    目录 1.简介 2.介绍 3.前期配置 3.1.坐标导入 3.2.配置文件 3.3.配置类 4.Java操作Redis 1.简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻译:Redis 是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 官网链接:https://redis

  • Spring boot详解缓存redis实现定时过期方法

    目录 前言 添加依赖 添加配置 常规缓存 开启缓存 设置缓存空间 设置缓存 增加设置缓存过期时间 总结 后记 前言 使用redis进行缓存数据,是目前比较常用的缓存解决方案.常用的缓存形式有一下几种: 1.纯原生代码进行redis的增删改查,手工编写缓存工具类,由开发者在代码中进行调用. 优势:代码由实际使用的开发者进行维护,便于定制化的改造. 2.使用市场上已有的缓存工具,也就是大家常说的大佬的轮子 优势:方便快捷,提升开发效率 添加依赖 修改pom文件引入如下配置 <?xml version

  • Spring Boot详解五种实现跨域的方式

    目录 一.为什么会出现跨域问题 二.什么是跨域 三.非同源限制 四.java后端实现CORS跨域请求的方式 1. 返回新的CorsFilter(全局跨域) 2. 重写WebMvcConfigurer(全局跨域) 3. 使用注解 (局部跨域) 4. 手动设置响应头(局部跨域) 5. 使用自定义filter实现跨域 一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能

  • Spring Boot详解创建和运行基础流程

    目录 1. 初始 Spring Boot 1.1 什么是Spring Boot 1.2 Spring Boot 的优点 2. 创建 Spring Boot 项目(Idea) 2.1 首先安装 Spring Assistant 插件 2.2 重启Idea-New Project ① 点击 Spring Assistant 直接Next就可以了 ② Next 之后的页面介绍 ③ 引入依赖, 选择Spring Boot的版本 ④ 选择项目名称和保存路径 ⑤ Spring Boot 项目创建完成 3.

  • Spring Boot详解配置文件的用途与用法

    目录 1. SpringBoot 配置文件 1.1 配置文件的作用 1.2 配置文件的格式 1.3 properties 配置文件说明 1.3.1 properties 基本语法 1.3.2 读取配置文件 1.4 yml 配置文件说明 1.4.1 yml 基本语法 1.4.2 yml 使用进阶 1.4.3 配置对象 1.4.4 配置集合 1.4.5 yml的另一种写法(行内写法) 1.5 properties 和 yml 比较 2. 读取 SpringBoot 配置文件的方法 2.1 使用 @V

  • Spring Boot详解整合JWT教程

    目录 1.概述 2.优势所在 3.结构组成 3.1.标头(Header) 3.2.有效负载(Payload) 3.3.签名(Signature) 4.Spring boot整合JWT 导入依赖 1.概述 JWT 简称 JSON Web Token,也就是通过JSON形式作为Web应用中的令牌,用于各方之间安全地将信息作为JSON对象传输,在数据传输的过程中还可以完成数据加密.签名等相关处理. 2.优势所在 在JavaWeb阶段,经常使用session来存储,以方便用来判断用户是否操作等等.但这又

  • Spring Boot详解各类请求和响应的处理方法

    目录 1. HttpServletRequest与HttpServletResponse 2. GET类型的请求 2.1 /students?current=1&limit=20 2.2 /student/123 3. POST类型的请求 4. 响应HTML格式的数据 4.1 使用ModelAndView 4.2 使用Model 5. 响应JSON格式的数据 5.1 单组数据 5.2 多组数据 1. HttpServletRequest与HttpServletResponse 浏览器输入:htt

  • Spring Boot详解配置文件有哪些作用与细则

    目录 一.配置文件的作用 二.配置文件的格式 三.properties配置文件的说明 1.properties基本语法 2.读取配置文件 3.properties的缺点 四.yml配置文件的说明 1.yml基本语法 2.读取配置文件 3.配置对象 4.配置集合 五.properties和yml的区别 一.配置文件的作用 配置文件是非常重要的,整个项目中所有的重要数据都是在配置文件中进行配置的例如: 数据库的连接信息(用户名和密码的设置): 项目启动的端口: 第三方系统调用的秘钥信息: 可以发现和

  • Spring Boot 与 Kotlin 使用Redis数据库的配置方法

    Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra. 使用Redis Redis是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型. Key-Value 数据库. Redis官网 Redis中文社区 引入依赖 Spring Boot提供的数据访问框架Spring Data Redis基于Jedi

  • .NET程序员如何入门Spring Boot详解

    前言 本篇文章将教你作为一个.NET程序员如何快入门Spring Boot.你不需要用Eclipse,也不需要用IDEA.已经习惯了VS,其他的IDE-- 但不得不说VS Code很厉害,一用就喜欢.微软给VS Code提供了编写Java的插件,你可以在VS Code上愉快地写Java. 一.环境搭建 (1) 安装Java.配置环境变量.(教程很多,这里不多说) (2) 安装Maven和配置.参考https://www.cnblogs.com/eagle6688/p/7838224.html (

随机推荐