基于Springboot3集成Redis实现延时任务,自动取消订单延时功能

文章目录

    • java延迟任务实现方式
    • redis key过期

概要

订单超时自动取消,即到一定时间后自动启动一个任务去做一件事情,当然还有一种方式查看订单取消,在查询订单信息时,判断当前时间与创建的时间,两个之间相互比对,判断订单的是否逻辑删除或者物理删除,执行相关的逻辑进行订单超时取消功能

这里主要讲了使用Redis 的key过期自动回调功能进行订单的超时自动取消功能

java延迟任务实现方式

  • 定时任务
    • JDK的Timer
    • xxl-job
    • Qurtaz
  • 消息队列
    • RabbitMQ
    • RocketMQ
    • kafka(kafka本身不支持延迟消息,可以通过其他方式实现kafka的延迟消息)
  • JDK延迟队列DelayQueue
  • redis的key过期提醒

redis key过期

redis2.8之后才能进行key过期回调

通过notify-keyspace-events实现事件监听配置并且重启redis

在redis.conf加入一条配置:

notify-keyspace-events Ex
字符        发送的通知
K键空间通知,所有通知以__keyspace@<db>__为前缀
E键事件通知,所有通知以__keyevent@<db>__为前缀
gdel、expire、rename 等类型无关的通用命令的通知
$string命令的通知
Ilist命令的通知
sset命令的通知
hset命令的通知
zzset命令的通知
x过期事件:每当有过期键被删除时发送
e驱逐(evict)事件:每当有键因为maxmemoryi政策而被删除时发送
A参数gslshzxe的别名

redis监听配置

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.RedisMessageListenerContainer;

/**
 * @author yan
 * @describe "严禁过度自燃!"
 * @time 2024/3/24 19:36:58
 */
@Configuration
public class RedisListenerConfig {

   @Autowired
   private RedisConnectionFactory redisConnectionFactory;

   /**
    * 配置Redis消息监听
    * @return
    */
   @Bean
   public RedisMessageListenerContainer container() {
       RedisMessageListenerContainer container = new RedisMessageListenerContainer();
       container.setConnectionFactory(redisConnectionFactory);
       return container;
  }

   /**
    * 监听key过期
    * @return
    */
   @Bean
   public RedisKeyExpirationListener keyExpirationListener() {
       return new RedisKeyExpirationListener(this.container());
  }
}

获取过期的key

/**
 * @author yan
 * @describe "严禁过度自燃!"
 * @time 2024/3/24 19:37:11
 */
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

   public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
       super(listenerContainer);
  }


   @Override
   public void onMessage(Message message, byte[] pattern) {
       String expireKey = message.toString();
       System.out.println("key====>" + expireKey);

  }
}
  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值