spring boot实现 redis延迟发送消息

1. 简介

1.1 什么是延迟任务?

  • 定时任务:有固定周期的,有明确的触发时间

  • 延迟队列:没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行,也可以延迟

1.2 应用场景

  • 场景一:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单;如果期间下单成功,任务取消
  • 场景二:接口对接出现网络问题,1分钟后重试,如果失败,2分钟重试,直到出现阈值终止

1.3 redis实现延迟方式

  • ​ Redis中的zset数据类型的去重有序(分数排序)特点进行延迟。

  • ​ 例如使用时间戳作为score进行排序

2. 实现步骤

  1. 首先需要添加Redis的依赖,在pom.xml文件中添加以下内容:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 创建Redis配置类,配置Redis连接信息:
@Configuration
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }
}
  1. 创建延迟队列处理类,实现将消息存储到Redis中的延迟队列中:
@Component
public class DelayQueueHandler {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    //添加消息,并指定延迟时间
    public void push(String key, Object value, long delayTime) {
        redisTemplate.opsForZSet().add(key, value, System.currentTimeMillis() + delayTime);
    }

    //删除消息
    public void remove(String key, Object value) {
        redisTemplate.opsForZSet().remove(key, value);
    }

    //
    public List<Object> pop(String key, long startTime, long endTime) {
        Set<Object> values = redisTemplate.opsForZSet().rangeByScore(key, startTime, endTime);
        List<Object> result = new ArrayList<>(values);
        redisTemplate.opsForZSet().removeRangeByScore(key, startTime, endTime);
        return result;
    }
}
  1. 在需要使用延迟队列的地方,实现向延迟队列中添加延迟消息:
@Autowired
private DelayQueueHandler delayQueueHandler;

    public void addToDelayQueue() {
    long delayTime = 10000; // 延迟10秒
    String key = "delay_queue:test";
    Object value = "test_message";
    delayQueueHandler.push(key, value, delayTime);
}
  1. 定时任务类,实现定时从Redis延迟队列中获取消息,并进行下一步处理:
@Component
public class DelayQueueTask {

    @Autowired
    private DelayQueueHandler delayQueueHandler;

    @Scheduled(fixedDelay = 1000)
    public void execute() {
        String key = "delay_queue:test";
        long startTime = 0;
        long endTime = System.currentTimeMillis();
        List<Object> values = delayQueueHandler.pop(key, startTime, endTime);
        for (Object value : values) {
            // 处理延迟消息
            
        }
    }
}
  1. 开启springboot的延迟任务

    在spring boot的启动类上面添加注解**@EnableScheduling**

这样就实现了Spring Boot中使用Redis实现延迟队列的功能。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微服务架构是一种新兴的软件架构体系,它将一个大型应用程序分解为多个独立的服务,每个服务都提供一定的功能,服务之间通过轻量级的通信机制协同工作,构成一个松散耦合的系统。 而 Spring Boot 是一个快速创建基于 Spring 的应用程序的框架。它采用约定大于配置的方式,简化了 Spring 应用程序的开发,同时提高了应用程序的可维护性。 Redis 是一种高速缓存数据库,具有高并发和低延迟的特点。它能够在存储和读取大规模数据时提供快速的性能和可靠的持久性。 秒杀是指在限定时间内,将大量的请求按照系统预设的规则进行处理,从而实现购买或者抢购等活动。在传统的单机架构中,秒杀的高并发场景经常会导致系统崩溃或者响应缓慢,因此需要采用新的技术来解决这个问题。 将微服务、Spring BootRedis 结合起来,可以有效地解决秒杀系统的高并发问题。采用微服务架构,可以将每个服务拆分为独立的功能,提高系统的可扩展性和可维护性。使用 Spring Boot 框架,则可以快速搭建服务,并利用它的依赖注入和 AOP 等特性,增加代码的复用性和可维护性。而 Redis 则可以作为高速缓存数据库,提高系统的响应速度和可靠性。 在秒杀场景中,可以将商品和库存信息缓存在 Redis 中,同时采用消息队列来控制请求的流量,避免系统瞬时崩溃。在秒杀活动开始前,将商品信息和库存信息加载到 Redis 中,由 Redis 进行管理,并在秒杀结束后将结果写入数据库中。通过这种方式,可以提高系统的吞吐量和可靠性,同时保证秒杀活动的公平性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值