分布式利器redis及redisson的延迟队列实践

 更新时间:2022年03月01日 13:02:18   作者:kl  
这篇文章为大家主要介绍了分布式利器redis及redisson的延迟队列实践,搜遍全网好像还没有使用redisson的延迟队列的,redisson作为一个分布式利器,这么好用的工具没人用有点可惜

前言碎语

首先说明下需求,一个用户中心产品,用户在试用产品有三天的期限,三天到期后准时准点通知用户,试用产品到期了。这个需求如果不是准时通知,而是每天定点通知就简单了。如果需要准时通知就只能上延迟队列了。使用场景除了如上,典型的业务场景还有电商中的延时未支付订单失效等等。

延迟队列多种实现方式

  • 1.如基于RabbitMQ的队列ttl+死信路由策略:通过设置一个队列的超时未消费时间,配合死信路由策略,到达时间未消费后,回会将此消息路由到指定队列
  • 2.基于RabbitMQ延迟队列插件(rabbitmq-delayed-message-exchange):发送消息时通过在请求头添加延时参数(headers.put("x-delay", 5000))即可达到延迟队列的效果
  • 3.使用redis的zset有序性,轮询zset中的每个元素,到点后将内容迁移至待消费的队列,(redisson已有实现)
  • 4.使用redis的key的过期通知策略,设置一个key的过期时间为延迟时间,过期后通知客户端

redisson中的延迟队列实现

怎么封装便于业务使用。

1.首先定义一个延迟job,里面包含一个map参数,和队列执行器的具体实现class,触发任务执行时,map参数会被传递到具体的业务执行器实现内

/**
 * Created by kl on 2018/7/20.
 * Content :延时job
 */
public class DelayJob {
    private Map jobParams;//job执行参数
    private Class aClass;//具体执行实例实现
}

2.定义一个延迟job执行器接口,业务需要实现这个接口,然后在execute方法内写自己的业务逻辑

/**
 * Created by kl on 2018/7/20.
 * Content :延时job执行器接口
 */
public interface ExecuteJob {
     void execute(DelayJob job);
}

3.消费已经到点的延时job服务,通过job参数调用业务执行器实现

@Component
public class JobTimer {
    static final String jobsTag = "customer_jobtimer_jobs";
    @Autowired
    private RedissonClient client;
    @Autowired
    private ApplicationContext context;
    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
    @PostConstruct
    public void startJobTimer() {
        RBlockingQueueblockingQueue = client.getBlockingQueue(jobsTag);
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        DelayJob job = blockingQueue.take();
                        executorService.execute(new ExecutorTask(context, job));
                    } catch (Exception e) {
                        e.printStackTrace();
                        try {
                            TimeUnit.SECONDS.sleep(60);
                        } catch (Exception ex) {
                        }
                    }
                }
            }
        }.start();
    }
    class ExecutorTask implements Runnable {
        private ApplicationContext context;
        private DelayJob delayJob;
        public ExecutorTask(ApplicationContext context, DelayJob delayJob) {
            this.context = context;
            this.delayJob = delayJob;
        }
        @Override
        public void run() {
            ExecuteJob service = (ExecuteJob) context.getBean(delayJob.getaClass());
            service.execute(delayJob);
        }
    }
}

4.封装延时job服务

/**
 * Created by kl on 2018/7/20.
 * Content :延时job服务
 */
@Component
public class DelayJobService {
    @Autowired
    private RedissonClient client;
    public void submitJob(DelayJob job, Long delay, TimeUnit timeUnit){
        RBlockingQueueblockingQueue = client.getBlockingQueue(JobTimer.jobsTag);
        RDelayedQueue delayedQueue = client.getDelayedQueue(blockingQueue);
        delayedQueue.offer(job,delay,timeUnit);
    }
}

文末结语

redisson作为一个分布式利器,这么好用的工具没人用有点可惜,还有一个原因是有个想法,想将延迟队列这个功能封装成一个spring boot的start依赖,然后开源出来,造福四方,希望大家以后多多支持脚本之家!

相关文章

  • 详解SSH框架和Redis的整合

    详解SSH框架和Redis的整合

    本篇文章主要介绍了SSH框架和Redis的整合,详细的介绍了Struts+Spring+Hibernate和Redis整合,有兴趣的可以了解一下。
    2017-03-03
  • Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)

    Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)

    本文主要介绍了Redis三种集群搭建配置,包括主从集群、哨兵集群、分片集群,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • K8s部署Redis主从集群教程

    K8s部署Redis主从集群教程

    本文介绍了在Kubernetes环境下搭建Redis集群的详细步骤,包括环境准备、安装NFS、创建PV卷、搭建Redis集群、集群初始化、主从切换测试以及开放外网端口等内容
    2025-01-01
  • Redis实现布隆过滤器缓存去重的"智能门卫"(实例详解)

    Redis实现布隆过滤器缓存去重的"智能门卫"(实例详解)

    布隆过滤器(Bloom Filter)本质是一个基于哈希函数的概率型数据结构,核心作用是快速判断一个元素是否存在于集合中,今天给大家介绍Redis实现布隆过滤器缓存去重的"智能门卫",感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • Redis+Caffeine两级缓存的实现

    Redis+Caffeine两级缓存的实现

    本文主要介绍了Redis+Caffeine两级缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Redisson分布式限流的实现原理分析

    Redisson分布式限流的实现原理分析

    这篇文章主要介绍了Redisson分布式限流的实现原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 一篇文章带你弄清楚Redis的精髓

    一篇文章带你弄清楚Redis的精髓

    Redis是一个开源的、支持网络、基于内存的键值对存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据类型,包括字符串、散列、列表、集合、位图等,拥有极快的读写速度,并且支持丰富的特性,如事务、持久化、复制、脚本、发布/订阅等。
    2023-02-02
  • Redis cluster集群模式的原理解析

    Redis cluster集群模式的原理解析

    这篇文章主要介绍了Redis cluster集群模式的原理解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Redis和MySQL保证双写一致性的问题解析

    Redis和MySQL保证双写一致性的问题解析

    Redis和MySQL的双写一致性指的是在同时使用缓存和数据库存储数据的时候,保证Redis和MySQL中数据的一致性,那么如何才能保证他们的一致性呢,下面小编就来为大家详细讲讲
    2023-11-11
  • Redis Cluster集群收缩主从节点详细教程

    Redis Cluster集群收缩主从节点详细教程

    集群收缩的源端就是要下线的主节点,目标端就是在线的主节点,这篇文章主要介绍了Redis Cluster集群收缩主从节点详细教程,需要的朋友可以参考下
    2021-11-11

最新评论