基于Redis过期事件实现定单超时取消
定单超时取消的实现,首先想到的是定时任务,但是这类实现方式在定单量较大的情况下是有问题的,而且时间也会有误差,最大时间差就是定时任务的履行间隔时间。
使用redis的过期监听事件可以比较不错的解决这个问题。实现的方式是定单创建后向redus中存一记录,一般就以定单号为key。设置过期时间(定单超时时间),一旦时间超时会触发监听事件,这时候候就能够通过key判断这个定单会不会支付,未支付时取消定单。
redis过期监听的实现:
1.修改redis.windows.conf配置文件中notify-keyspace-events的值
默许配置notify-keyspace-events的值为” “,修改成 notify-keyspace-events Ex 这样便开启了过期事件
2. 创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)
@Configuration public class RedisListenerConfig { @Autowired private RedisTemplate redisTemplate; /** * 处理乱码 * @return */ @Bean public RedisTemplate redisTemplateInit() { // key序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); //val实例化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }
3.继承KeyExpirationEventMessageListener创建redis过期事件的监听类
KeyExpirationEventMessageListener类是org.springframework.data.redis.listener包下的实现类,通过继承这个类重写onMessage方法可以实现对redis所有过期事件的监听。
@Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer container) { super(container); } /** * 针对redis数据失效事件,进行数据处理 * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { String key=message.toString();//生效的key if (key!=null && key.startsWith("order")){//从失效key中挑选代表定单失效的key //截取定单号,查询定单,如果是未支付状态则取消定单 String orderNo=key.substring(5); System.out.println("定单号为:"+orderNo+"的定单超时未支付,取消定单"); } } }
测试
通过redis摹拟创建一个有效时间为5s的定单:
5秒后程序成功监听到了过期事件:
到此这篇关于基于Redis过期事件实现定单超时取消的文章就介绍到这了,更多相关Redis 定单超时取消内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
文章来源:丸子建站
文章标题:基于Redis过期事件实现定单超时取消
https://www.wanzijz.com/view/64733.html