目录

1. 开源项目地址

2. 为什么写这个

3. 使用者需要做的事情

4. 特性

5. 图示

6. 使用场景

7. 代码实例


1. 开源项目地址

redisblist redis阻塞队列执行器

springboot redis 阻塞队列 redis实现阻塞队列_使用场景

https://github.com/chlInGithub/redisblist

2. 为什么写这个

出于使用简洁代码以满足业务需求的目的,避免重复写业务无关的代码,我对'redis阻塞队

列使用过程中'的通用性代码进行了封装,并且增加了一些特性。

3. 使用者需要做的事情

实现RedisTemplate接口,向队列添加元素,添加元素处理者.

4. 特性

  • redis本身的高性能、高可用;
  • redis阻塞队列的阻塞和分发特性;
  • 周期概念
  • 从将所有待处理元素批量加入到阻塞队列,直到这些元素被处理完毕,称为一个周期;
  • 可记录周期完毕状态;
  • 可在周期完毕时进行回调;
  • 记录处理失败的数量;
  • 元素不会丢失
  • 正在处理队列。消费者获取元素后,元素进入正在处理队列,完毕后从该队列删除。
  • 检查机制。考虑的场景:消费者处理元素过程中,由于重启或宕机,导致元素未被处理。
  • 元素存储在redis队列,对比服务端使用线程池,不必考虑队列长度、数据丢弃策略。
  • 资源充分利用
  • 服务器集群消费阻塞队列,对比单机使用线程池,资源利用更充分。
  • 处理进度概要

5. 图示

springboot redis 阻塞队列 redis实现阻塞队列_redis_02

6. 使用场景

  • 分片处理 ,集群处理一批数据 比 单实例 快很多;
  • 依赖关系,周期A处理完毕,触发周期B开始,……;
  • 普通的阻塞队列使用场景;

7. 代码实例

// 第一步  实现 RedisTemplate
public class RedisTemplateImpl implements RedisTemplate{
    // ...
}
// 第二步 向阻塞队列添加元素

// 与profile相关的环境标志
String env;
String blockKey = RedisBlockListUtils.getBlockListKey("自定义队列名称", env);

// 准备待处理元素
List<String> params;
// 作为新周期
RedisBlockListExecutor.add4NewPeriod(new RedisTemplateImpl(), blockKey, params);

// 不适用周期
// RedisBlockListExecutor.add(new RedisTemplateImpl(), blockKey, params, false/true);
// 第三步 添加元素处理的工作者
private void addXXWorker() {
        RedisBlockListWorker worker = new RedisBlockListWorker() {

            @Override
            public ProcessResult process(String val) {
                ProcessResult processResult = new ProcessResult();
                // TODO 业务逻辑
                try {
                     // TODO 业务逻辑
                } catch (Exception e) {
                     processResult.incrFail();
                }
                return processResult;
            }

            @Override
            public void doneCallBack(String val) {
                super.doneCallBack(val);

                // TODO 
                
            }
        };

        RedisBlockListContext redisBlockListContext = new RedisBlockListContext();
        redisBlockListContext.setBlockListKey(blockKey);
        //redisBlockListContext.setDealDone(true);

        worker.setRedisBlockListContext(redisBlockListContext);
        worker.setRedisTemplate(new RedisTemplateImpl());

        RedisBlockListExecutor.execute(worker);
}