package com.eyee.community.config.redis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
return container;
}
}
package com.eyee.community.config.listener;
import com.eyee.community.mapper.mysql.PostingMapper;
import com.eyee.community.queue.BeanContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import java.util.List;
import static java.util.concurrent.TimeUnit.SECONDS;
/**
* @Description: 监听redis的key失效
* @Author: Mr.Jhon Li
* @Date: 2018/12/8
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
RedisTemplate redisTemplate;
private PostingMapper postingMapper;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
this.postingMapper = BeanContext.getApplicationContext().getBean(PostingMapper.class);
String expiredKey = message.toString();
if(expiredKey.startsWith("unloadPostingIdList")){
List<String> stringList= postingMapper.selectAllPostingId();
for (String s : stringList) {
redisTemplate.opsForList().leftPush("unloadPostingIdList",s);
}
redisTemplate.expire("unloadPostingIdList",1000,SECONDS);
}
}
}