普通的定时任务:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时任务开始执行!");
}
},System.currentTimeMillis()-60*1000L);
因为我们做的是消息服务,当同时又很多条消息时会创建大量的线程,极度消耗资源,所以用redis去消化,当redis中的某个key失效的时候,根据key更新相应的业务
直接上代码:
1、修改redis.conf
安装的redis服务默认是: notify-keyspace-events “”,修改成 notify-keyspace-events Ex;
位置:redis安装目下的redis.windows-service.conf 或 redis.windows.conf。(具体看redis服务加载的哪个配置, 貌似要redis 2.8+才支持)
@Component
public class RedisConfig {
/**
* redis监听器
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
/// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
return container;
}
}
监听所有的过期key:
/**
* 监听所有db的过期事件__keyevent@*__:expired"
*
* @author lsm
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private BesMessageRepository besMessageRepository;
@Autowired
private PushMessageHandler pushMessageHandler;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* redis.conf 设置 notify-keyspace-events "Ex"
*
* @param message
* @param pattern
*/
@Override
public synchronized void onMessage(Message message, byte[] pattern) {
//expiredKey是redis的过期key
String expiredKey = message.toString();
if (expiredKey.startsWith(CacheKeys.MESSAGE_TIMED_SENDING)) {
//做相应的业务处理
}
}
}