在实际的开发项目中,监听 key 的过期事件,应用非常广泛,例如:订单超时未支付,优惠券过期等等
一、说明
本篇文章是继:
【SpringBoot】三十四、SpringBoot整合Redis实现序列化存储Java对象
其中涉及到的知识及代码,本篇文章不再进行赘述
二、修改 Redis 配置文件
- 1、在 Redis 的安装目录
- 2、找到 redis.windows.conf 文件,搜索 “notify-keyspace-events”
修改为 “notify-keyspace-events Ex”,这样我们的 Redis 就支持 key 过期事件的监听了
三、注入redisMessageListenerContainer
注意:本偏文章衔接与上篇文章:【SpringBoot】三十四、SpringBoot整合Redis实现序列化存储Java对象,其中的配置信息本篇文章不在赘述
- 1、还是在 RedisConfig.java 中注入一个 redisMessageListenerContainer 的Bean 用于监听
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 监听所有库的key过期事件
container.setConnectionFactory(connectionFactory);
return container;
}
- 2、创建监听类RedisKeyExpirationListener
我们需要创建监听 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
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
}
/** * 针对 redis 数据失效事件,进行数据处理 */
@Override
public void onMessage(Message message, byte[] pattern) {
// 拿到key
log.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;
@SpringBootTest
class RedisTestApplicationTests {
@Autowired
private RedisUtils redisUtil;
@Test
void 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秒后…
触发了 key 过期事件,这时候,我们拿到过期的 key 就可以对应的做一些业务处理了
如您在阅读中发现不足,欢迎留言!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10454.html