一、Redis键过期机制概述
- Redis键空间通知原理
- 事件发布/订阅模型
expired
事件触发条件
- 应用场景
- 自动清理关联数据
- 延时任务执行
- 会话超时管理
二、Redis服务端配置
-
修改
redis.conf
:propertiesnotify-keyspace-events Ex
-
动态配置命令:
bashCONFIG SET notify-keyspace-events Ex
-
验证配置:
CONFIG GET notify-keyspace-events
三、Java实现核心步骤
-
依赖配置
xml<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.0</version> </dependency>
-
事件订阅通道
- 过期事件通道:
__keyevent@0__:expired
- 数据库索引替换规则
- 过期事件通道:
-
监听器实现
javapublic class KeyExpiredListener extends JedisPubSub { @Override public void onMessage(String channel, String message) { System.out.println("Key expired: " + message); } }
-
订阅服务启动
javaJedis jedis = new Jedis("localhost", 6379); jedis.subscribe(new KeyExpiredListener(), "__keyevent@0__:expired");
四、完整实现示例
java
public class RedisKeyExpirationMonitor {
public static void main(String[] args) {
new Thread(() -> {
try (Jedis jedis = new Jedis("localhost", 6379)) {
jedis.subscribe(new KeyExpiredListener(), "__keyevent@0__:expired");
}
}).start();
}
static class KeyExpiredListener extends JedisPubSub {
@Override
public void onMessage(String channel, String expiredKey) {
// 业务处理逻辑
System.out.printf("[%s] Key expired: %s%n",
LocalDateTime.now(), expiredKey);
}
}
}
五、测试验证
-
设置测试键值:
bashSET test_key "value" EX 5 # 5秒后过期
-
观察控制台输出:
[2023-08-10T14:30:25] Key expired: test_key