基于Redis实现分布式定时任务
原理利用redis(2.8.0+版本)订阅发布模式 ,当key过期时触发相关事件修改redis配置文件# 在配置文件种加入这句话,开启key过期通知。然后重启redisnotify-keyspace-events Ex测试是否配置正确redis-cli开两个窗口cli-1 订阅频道__keyevent@0__:expired127.0.0.1:6379> PSUBSCRIBE __keyev
·
原理
利用redis(2.8.0+版本)订阅发布模式 ,当key过期时触发相关事件
修改redis配置文件
# 在配置文件种加入这句话,开启key过期通知。然后重启redis
notify-keyspace-events Ex
测试是否配置正确
redis-cli开两个窗口
cli-1 订阅频道__keyevent@0__:expired(0代表数据库用的5就改为5)
127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
cli-2 存入一个 key,并设置过期时间
127.0.0.1:6379> set test hahah EX 5
OK
当 5 秒过后,cli-1 收到信息就代表配置成功
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "test"
Springboot 接收 Redis 过期通知
接收通知类
import org.springframework.stereotype.Component;
/**
* @author asmn
* @date 2021/11/24
*/
@Component
public class RedisMessageReceiver {
/**
* 接收redis消息,并处理
*
* @param message 过期的key
*/
public void receiveMessage(String message) {
System.out.println("通知的key是:" + message);
}
}
频道订阅
@Configuration
public class RedisConfig {
.....其他不相关代码.......
/**
* 订阅频道
*
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// 订阅通道,key过期时通知
container.addMessageListener(listenerAdapter, new PatternTopic("__keyevent@0__:expired"));
// 可以订阅多个通道
return container;
}
/**
* 配置redis事件监听处理器
*
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisMessageReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
......其他不相关代码......
}
补充
window下重启redis
关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown
如果有密码,请先登录redis
redis-cli
# password为你的密码
auth "password"
shutdown
启动
redis-server redis.windows.conf
更多推荐
所有评论(0)