在 Spring Boot 中使用 Redis 时,你一定需要过这种需求:更新某个 Redis 的 Value 值,但是不修改它的 TTL(Time To Live),也就是过期时间。
例如:使用 Redis 存储用户的 Session,过期时间为半个小时。用户的每次访问,我们都需要更新用户 Session 的 Value 值,表示用户的最后一次访问时间。但是又不能修改用户 Session 的过期时间。
有 2 种方式可以实现。
先获取过期时间,再修改 这种方式最简单,也是最容易想到。在执行修改前,先获取到这个 Key 的剩余过期时间。然后通过 SET 命令执行修改,也就是完全覆盖这个 Key / Value,同时指定剩余的过期时间。
@Autowired StringRedisTemplate stringRedisTemplate; @Test public void test() { // session key String key = "session::01"; // 先获取 key 的过期时间,单位是秒 Long expire = this.stringRedisTemplate.getExpire(key); if (expire != null && expire > 0) { // 重新设置 key,并且指定过期时间 this.
在 Redis 数据库中,可以通过 EXPIRE、EXPIREAT、EXPIRETIME 命令来设置 Key 的有效时间,当一个 Key 过期后会自动从数据库中删除,释放空间。
得益于于这个特性,我们可以很轻松地实现诸多类似于 “Session” 管理、数据缓存等功能。它们都有一个共同点就是,数据不会永久保存!
在有些场景中,我们可能希望在某些 Key 过期的时候获取到通知,进行一些业务处理。或者是干脆用于 “定时通知/任务” 功能,例如:下单 30 分钟后未支付,则取消订单。那么可以在用户下单的时候使用订单号作为 key 设置到 Redis 数据库中,并且设置过期时间为 30 分钟。当超时后,我们可以在 “key 过期通知” 中获取到 key 也就是订单号,判断用户是否已经支付从而是否取消订单。
注意: Redis 的 Key 过期通知功能本质上是通过 发布/订阅 功能实现的。也就是说,它不能保证通知消息的交付,当 Key 过期时如果服务器停机、重启中则该通知消息会永久丢失。
本文将会带你学习如何在 Spring Boot 应用中使用 Spring Data Redis 监听 Redis Key 过期事件。
本文所使用的软件版本:
Spring Boot:3.1.3 Redis:7.0.5 整合 Spring Data Redis 得益于 Spring Boot 对 Redis 开箱即用的支持,只需要 2 步,就可以快速地在 Spring Boot 中整合、使用 Redis。
1、简介 在本教程中,我们将学习如何在 Spring Data Redis 中配置 key 的过期时间。
2、项目设置 假设我们有一个整合了 spring data redis 的 spring boot 项目,我们打算使用 redis 来管理用户的会话(Session)。
2.1、依赖 首先,在 pom.xml 中添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>3.0.4</version> </dependency> spring-boot-starter-data-redis 将传递依赖 spring-data-redis 和 lettuce-core。
2.2、Redis 配置 其次,添加 RedisTemplate 配置:
@Configuration public class RedisConfiguration { @Bean public RedisTemplate<String, Session> getRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Session> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } } 2.3、Model 第三,创建 Session model:
@RedisHash public class Session { @Id private String id; private Long expirationInSeconds; } 2.