说明:本问为redis信息失效发布demo:
使用场景:如订单定时未支付,可将订单id存入redis设置过期时间,
结合mq做订单失效,库存回补功能;
1.开启过期订阅功能。
import com.example.demo.listener.KeyExpiredListener;
import org.springframework.beans.factory.annotation.Autowired;
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.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
/**
* redis配置文件开启:
*notify-keyspace-events Ex
* redis过期消息订阅功能
*/
@Configuration
public class PubsubConfiguration {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
/**
* 设置订阅事件
* @return
*/
@Bean
public PatternTopic patternTopic(){
return new PatternTopic("__keyevent@*__:expired");//订阅所有库
}
@Bean
RedisMessageListenerContainer container() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
}
@Bean
public KeyExpiredListener keyExpiredListener(){
return new KeyExpiredListener(container());
}
}
2.收集过期信息,做相应业务处理;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.lang.Nullable;
import java.nio.charset.StandardCharsets;
/**
* redis失效消息推送
*/
@Slf4j
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* redis消息失效的监听
*
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, @Nullable byte[] pattern) {
String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
String key = new String(message.getBody(), StandardCharsets.UTF_8);
String patterString = new String(message.getBody(), StandardCharsets.UTF_8);
log.info("key 失效:channel:{};key:{};patterString:{}", channel, key, patterString);
//以下可做业务处理(结合mq处理过期消息)
}
}

本文介绍了Redis中主键过期后的发布与订阅机制,适用于订单超时未支付等场景。通过将订单ID存入Redis并设置过期时间,配合消息队列(MQ),实现订单失效和库存回补功能。主要涉及开启过期订阅、监听并处理过期信息的业务流程。
3687

被折叠的 条评论
为什么被折叠?



