文章目录
-
- 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>__为前缀 |
g | del、expire、rename 等类型无关的通用命令的通知 |
$ | string命令的通知 |
I | list命令的通知 |
s | set命令的通知 |
h | set命令的通知 |
z | zset命令的通知 |
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);
}
}