springboot使用Redis,监听Redis键过期的事件设置与使用代码

时间:2022-04-09 15:00:41

我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行。

1、修改Redis配置文件

1.1:Windows下的Redis存在两个配置文件

springboot使用Redis,监听Redis键过期的事件设置与使用代码

修改带有service的配置文件才会有效。

打开配置文件,找到下面一行代码:

notify-keyspace-events ""

然后修改配置,如下图配置:

springboot使用Redis,监听Redis键过期的事件设置与使用代码

很简单,替换注释一下就好。

2、重启Redis服务

重启Redis服务有两种方式:

1、直接win+R,打开运行对话框,输入Services.msc,打开服务列表。然后找到Redis服务重启就好了。

2、打开cmd命令窗口,输入下面命令:

  redis-server --service-stop

springboot使用Redis,监听Redis键过期的事件设置与使用代码

关闭成功!!

3.打开cmd命令窗口,输入下面命令:

  redis-server --service-start

springboot使用Redis,监听Redis键过期的事件设置与使用代码

开启成功!!

3、在springboot项目中配置Redis配置

我的项目使用的是springboot2.0.5,所以一下配置适用springboot2.0.5项目,其他版本没试过。

两种方式:

第一种:指定:__keyevent@0__:expired,监听指定的db键的过期事件。

Redis配置第一步:

/**
* TODO Redis配置
* @author zhuzhen
* @date 16:20 2018/12/18
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport { /**
* TODO 监听 Redis键过期事件
* @author zhuzhen
* @date 14:38 2018/12/21
* @param connectionFactory
* @return org.springframework.data.redis.listener.RedisMessageListenerContainer
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
return container;
} }

Redis配置第二步:

实现MessageListener接口:

/**
* @author zhuzhen
* @version 1.0
* @description TODO 自定义Redis过期监听事件
* @className com.nongcai.rabbitmq.demo.redis.RedisExpiredListener
* @date 2018/12/21 14:42
*/
public class RedisExpiredListener implements MessageListener { @Override
public void onMessage(Message message, byte[] bytes) {
// 建议使用: valueSerializer
byte[] body = message.getBody();
byte[] channel = message.getChannel();
//Redis数据的键
String redisId = new String(body); System.out.println("onMessage >> " );
System.out.println(String.format("channel: %s \n body: %s \n bytes: %s"
,new String(channel), new String(body), new String(bytes))); }
}

第二种:监听所有的db键的过期事件。

Redis配置第一步:配置监听bean

 /**
* TODO 监听 Redis键过期事件
* @author zhuzhen
* @date 14:38 2018/12/21
* @param connectionFactory
* @return org.springframework.data.redis.listener.RedisMessageListenerContainer
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
return container;
}

Redis配置第二步:

/**
* @author zhuzhen
* @version 1.0
* @description TODO 监听所有db的过期事件__keyevent@*__:expired"
* @className com.nongcai.rabbitmq.demo.redis.RedisKeyExpirationListener
* @date 2018/12/21 14:39
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
} @Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
System.out.println("message>>> " + message);
System.out.println("pattern>>> " + new String(pattern));
String expiredKey = message.toString();
System.out.println("Redis的键:" + expiredKey); }
}

自此,监听Redis键过期事件配置完成。

spring关于Redis文章地址:https://spring.io/guides/gs/messaging-redis/