流程
1. 用户下单、存Redis key(0号库文件夹名称+订单号) value(订单号) 、设置失效时间。
2. 超时后调用Redis的key回调方法,拿到value值,判断订单状态。
3.根据订单状态,做业务处理。
具体操作
1.Redis配置文件开启key过期回调
2.在项目中建立文件夹,加入监听类
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.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RidesConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;//redis连接池
@Bean
public ChannelTopic expiredTopic() {
return new ChannelTopic("__keyevent@0__:expired"); // 选择0号数据库
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
System.out.println("============================Redis初始化配置2============================");
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
}
3.在项目中建立文件夹,重写失效回调方法,拿到过期key,做业务处理
import com.ruixin.common.utils.DateUtils;
import com.ruixin.common.utils.StringUtils;
import com.ruixin.goodsMainOrder.domain.SscGoodsMainOrder;
import com.ruixin.util.goodsOrderTaskUtil;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
@Component
public class RedisSubService extends KeyExpirationEventMessageListener {
public RedisSubService(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
//回调到这个方法
@Override
public void onMessage(Message message, byte[] pattern) {
super.onMessage(message, pattern);
String keyExpira = message.toString();
System.out.println("拿到过期key ,处理业务逻辑======" + keyExpira);
//拿到过期key ,处理业务逻辑
if (StringUtils.isNotNull(keyExpira) && StringUtils.isNotEmpty(keyExpira)) {
String[] keyStr = keyExpira.split(":");
if (keyStr[0].equals("main_order_nums")) {
System.out.println("拿到的主订单号为:" + keyStr[1]);
SscGoodsMainOrder goodsMainOrder = new SscGoodsMainOrder();
goodsMainOrder.setMainOrderNum(keyStr[1]);
goodsMainOrder.setOrderStatus("4");
goodsMainOrder.setCancelReason("TimeOut");
goodsMainOrder.setCancelTime(DateUtils.getNowDate());
goodsOrderTaskUtil.updateMain(goodsMainOrder);
}
}
}
}
4.测试可用性(注:配置完第一步,需要重启Redis)
存入Redis缓存,存入时传入以下四个参数
key(0号库文件夹名称+订单号),value(字符串+订单号),过期时间,时间单位(分钟)