目录
1. 开源项目地址
2. 为什么写这个
3. 使用者需要做的事情
4. 特性
5. 图示
6. 使用场景
7. 代码实例
1. 开源项目地址
redisblist redis阻塞队列执行器https://github.com/chlInGithub/redisblist
2. 为什么写这个
出于使用简洁代码以满足业务需求的目的,避免重复写业务无关的代码,我对'redis阻塞队
列使用过程中'的通用性代码进行了封装,并且增加了一些特性。
3. 使用者需要做的事情
实现RedisTemplate接口,向队列添加元素,添加元素处理者.
4. 特性
- redis本身的高性能、高可用;
- redis阻塞队列的阻塞和分发特性;
- 周期概念
- 从将所有待处理元素批量加入到阻塞队列,直到这些元素被处理完毕,称为一个周期;
- 可记录周期完毕状态;
- 可在周期完毕时进行回调;
- 记录处理失败的数量;
- 元素不会丢失
- 正在处理队列。消费者获取元素后,元素进入正在处理队列,完毕后从该队列删除。
- 检查机制。考虑的场景:消费者处理元素过程中,由于重启或宕机,导致元素未被处理。
- 元素存储在redis队列,对比服务端使用线程池,不必考虑队列长度、数据丢弃策略。
- 资源充分利用
- 服务器集群消费阻塞队列,对比单机使用线程池,资源利用更充分。
- 处理进度概要
5. 图示
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);
}