SpringBoot redis系列 -延时队列(1)

本文介绍了如何在SpringBoot项目中使用Redis实现延时队列,通过Zset的特性实现消息的延迟消费。文章提到了在简单业务场景下,Redis延时队列可以作为异步解耦的解决方案,但不适合高可靠性要求的消息传递。文中包括了Message类的封装、延时队列工具类的创建、消息提供者和消费者的实现,以及SpringBoot定时任务的配置。
摘要由CSDN通过智能技术生成

SpringBoot redis系列 -延时队列(1)

背景

PS:笔者所在公司目前业务比较简单,相对项目架构也比较简单,暂时未有引入MQ等消息中间件,但是某天突然收到一个需求,需要在用户关注了我们的公众号之后,延迟几秒钟给用户在发送几条消息。最初考虑用要不DelayQueue或者定时线程池ScheduledThreadPoolExecutor走一波?感觉都不够优雅,刚好项目中有用到Redis,干脆就用Redis做个延时队列,也方便以后复用。当然,Redis实现的队列不是专业的MQ 对消息可靠性有高度要求的话,并不建议使用。比较简单的业务场景下还是可以用来异步延时解耦的。

9150e4e5gy1g9cxmqsitfj2073073wef.jpg

正文

延迟队列可以通过Zset(有序列表实现),Zset类似于java中SortedSet和HashMap的结合体,它是一个Set结构,保证了内部value值的唯一,同时他还可以给每个value设置一个score作为排序权重,Redis会根据score自动排序,我们每次拿到的就是最先需要被消费的消息,利用这个特性我们可以很好实现延迟队列。

spring:
  application:
    name: redis-example
  redis:
    host: localhost
    port: 6379
    # redis有16个库 默认选择第0个使用
    database: 0
    password:
# 端口给个0 代表随机选择一个未被使用端口
server:
  port: 0

封装一个统一的Message类,方便统一管理所有延迟消息格式

package com.smalljop.redis.example.queue;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * @description: 消息统一封装类
 * @author: smalljop
 * @create: 2020-01-03 10:20
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
    /**
     * 消息唯一标识
     */
    private String id;
    /**
     * 消息渠道 如 订单 支付 代表不同业务类型
     * 为消费时不同类去处理
     */
    private String channel;
    /**
     * 具体消息 json
     */
    private String body;

    /**
     * 延时时间 被消费时间  取当前时间戳 延迟时间
     */
    private Long delayTime;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;
}

封装一个延时队列工具类 负责维护队列 提供常用操作

package com.smalljop.redis.example.queue;

import com.fasterxml.ja
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值