SpringBoot怎么整合Redis,监听Key过期事件?

一、修改 Redis 配置文件

  • 1、在 Redis 的安装目录
  • 2、找到 redis.windows.conf 文件 , 搜索 “notify-keyspace-events”

SpringBoot怎么整合Redis,监听Key过期事件?文章插图
修改为 “notify-keyspace-events Ex” , 这样我们的 Redis 就支持 key 过期事件的监听了
二、注入redisMessageListenerContainer注意:本偏文章衔接与上篇文章:【SpringBoot】三十四、SpringBoot整合Redis实现序列化存储Java对象 , 其中的配置信息本篇文章不在赘述
  • 1、还是在 RedisConfig.java 中注入一个 redisMessageListenerContainer 的Bean 用于监听
@BeanRedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();// 监听所有库的key过期事件container.setConnectionFactory(connectionFactory);return container;}
  • 2、创建监听类RedisKeyExpirationListener
【SpringBoot怎么整合Redis,监听Key过期事件?】我们需要创建监听 key 过期类 , 来实现当事件触发时的具体操作
package com.zyxx.common.redis;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;/** * 监听 Redis key 过期事件 * * @Author Lizhou */@Slf4j@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {super(redisMessageListenerContainer);}/*** 针对 redis 数据失效事件 , 进行数据处理*/@Overridepublic void onMessage(Message message, byte[] pattern) {// 拿到keylog.info("监听Redis key过期 , key:{} , channel:{}", message.toString(), new String(pattern));}}我们可以监听到过期的 key 的信息 , 以及通道的信息
  • 3、操作 API
在 RedisUtils 中加入如下操作```java/** * 写入数据 , 并设置过期时间 */public boolean set(final String key, Object value, long time) {if (StringUtils.isBlank(key)) {return false;}try {template.opsForValue().set(key, value, time, TimeUnit.SECONDS);log.info("存入redis成功 , key:{} , value:{}", key, value);return true;} catch (Exception e) {log.error("存入redis失败 , key:{} , value:{}", key, value);e.printStackTrace();}return false;}借助此方法 , 我们可以向 Redis 中存入数据 , 并设置过期时间 , 单位为:秒(S)``
三、测试
  • 1、测试用例
package com.zyxx.redistest;import com.zyxx.redistest.common.RedisUtils;import com.zyxx.redistest.common.UserInfo;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.Date;@SpringBootTestclass RedisTestApplicationTests {@Autowiredprivate RedisUtils redisUtil;@Testvoid contextLoads() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setName("jack");userInfo.setCreateTime(new Date());// 放入redis , 并设置过期时间为5秒redisUtil.set("user", userInfo, 5);}}我们向 Redis 中存入了一个 key 为 “user” , value 为 UserInfo 对象的数据 , 并设置了过期时间为 5 秒
注意:在测试之前 , 我们需要启动我们的项目 , 才能将 Bean 注入到我们的容器中 , 监听事件才会生效
  • 2、测试结果可以看出我们的数据存入 Redis 成功
5秒后…
SpringBoot怎么整合Redis,监听Key过期事件?文章插图
触发了 key 过期事件 , 这时候 , 我们拿到过期的 key 就可以对应的做一些业务处理了
作者:Asurplus、
原文链接: