Redis—监听Key过期事件
在实际的开发项目中,监听 key 的过期事件,应用非常广泛,例如:优惠券过期,规定时间内支付,处理各种超时事件等等
创建一个配置类RedisListenerConfig
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
监听类
@Slf4j
@Component
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
@Autowired
public RedisTemplate<String,String> redisTemplate;
public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] bytes) {
//获取失效key名称
String key= new String(message.getBody(), StandardCharsets.UTF_8);
//获取key原本的value 获取不到 是null
String value = redisTemplate.opsForValue().get("myKey:monitor");
log.info("===========》获取失效key名称"+key);
log.info("===========》获取失效内容"+value );
}
}
测试
@RestController
public class RedisController {
@Autowired
public RedisTemplate<String,String> redisTemplate;
@RequestMapping(value = "/redisTest", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String redisTest(){
//redis中存入10秒失效的key
redisTemplate.opsForValue().set("myKey:monitor", "监听内容",10, TimeUnit.SECONDS);
String myKey = redisTemplate.opsForValue().get("myKey:monitor");
return myKey;
}
}
项目运行后,调这个接口,如果打印了onMessage()方法里打印的东西就成功了,里面就可以写自己的业务代码了