如果对时间精度要求不高的话,建议通过数据库定时任务实现即可,简单 方便。
注意:
redis过期通知的发送时间
Redis 使用以下两种方式删除过期的键:
- 当一个键被访问时,程序会对这个键进行检查,如果键已经过期,那么该键将被删除。
- 底层系统会在后台渐进地查找并删除那些过期的键,从而处理那些已经过期、但是不会被访问到的键。
当过期键被以上两个程序的任意一个发现、 并且将键从数据库中删除时, Redis 会产生一个 expired 通知。
Redis 并不保证生存时间(TTL)变为 0 的键会立即被删除: 如果程序没有访问这个过期键, 或者带有生存时间的键非常多的话, 那么在键的生存时间变为 0 , 直到键真正被删除这中间, 可能会有一段比较显著的时间间隔。
因此, Redis 产生 expired 通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。
Springboot具体实现步骤:
1.redis 配置文件redis.conf
notify-keyspace-events "" 改为 notify-keyspace-events Ex
2.
/**
* redis事件监听容器
* @author wangl
*
*/
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
3.
/**
* redis key失效
* @author wangl
*
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
private static final Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
@Autowired
private SysGroupActivityService sysGroupActivityService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对redis数据失效事件,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
logger.info("--------key:" + expiredKey + "已失效");
//TODO
}
}