Skip to content

Queue 持久队列

本文档说明 Zeze.Collections.Queue<V extends Bean> 持久化队列的初始化、FIFO/LIFO 双模式操作、内部链表结构及与 LinkedMap 的差异。

Zeze.Collections.Queue<V extends Bean> 是持久化队列,支持 FIFO(队列)LIFO(栈) 两种模式。所有操作在事务中执行,自动持久化。

核心特性说明
双模式同一实例可按 Queue(FIFO)或 Stack(LIFO)使用
持久化基于内部 Table,自动同步到数据库
事务安全乐观锁,操作原子可重入
热更新值类型支持热重载
节点分块大数据量分多节点存储,避免单记录过大
时间戳每个元素自动记录添加时间
// 1. 注册 Module
var queueModule = new Queue.Module(zeze);
// 2. 打开具名实例(默认每节点 30 个元素)
Queue<Task> taskQueue = queueModule.open("taskQueue", Task.class);
// 3. 自定义节点容量
Queue<Task> bigQueue = queueModule.open("bigQueue", Task.class, 100);
方法说明
open(name, class)打开具名队列,默认节点容量
open(name, class, nodeSize)打开具名队列,指定每节点元素数
openCsQueue(name, class)打开跨服务器队列,默认节点容量
openCsQueue(name, class, nodeSize)打开跨服务器队列,指定节点容量

CsQueue(跨服务器队列) 支持多服务器协同消费,适用于分布式任务分发场景。

操作说明
add(value)加入队尾
poll()取出并删除队首元素,空返回 null
peek()查看队首元素(不删除),空返回 null
queue.add(task1); // 队尾入队
queue.add(task2);
Task head = queue.poll(); // 取队首 task1,删除
Task next = queue.peek(); // 看 task2,不删
操作说明
push(value)压入栈顶
pop()弹出栈顶元素,空返回 null
queue.push(task1); // 栈顶
queue.push(task2);
Task top = queue.pop(); // 弹 task2

pop 内部即 poll,二者可混合使用:add/pollpush/pop 在同一实例上可交替调用。

操作说明
size()元素总数
isEmpty()是否为空
pollNode()取出一个节点(含多个值)
peekNode()查看一个节点(不删除)
walk(func)只读遍历
clear()清空

walk(TableWalkHandle<BQueueNodeKey, V> func)只读快照方式遍历,内部使用 selectDirty 读取,不持锁,适合统计、转储等场景。

queue.walk((nodeKey, value) -> {
// 处理每个元素
return true; // 返回 false 提前终止
});

Queue 内部由两层 Bean 构成,分别存储队列元信息与节点数据。

结构字段说明
BQueue(队列根)headNodeKey首节点 Key
tailNodeKey尾节点 Key
lastNodeId最后分配的节点 ID
count元素总数
BQueueNode(节点)nextNodeKey单向链表下一节点
values[]本节点存储的多个值
BQueueNodeValue(节点值)timestamp元素添加时间
valueDynamicBean 包装的实际值
KeyValue
_tQueuesnameBQueue(队列根)
_tQueueNodesname + nodeIdBQueueNode(节点)
HeadNode ──▶ Node1 ──▶ Node2 ──▶ ... ──▶ TailNode
│ │ │
values[] values[] values[]
(≤nodeSize) (≤nodeSize) (≤nodeSize)

每个节点可存放多个 value(由 nodeSize 决定),节点间以单向链表串联。

维度QueueLinkedMap
访问方式只能访问队首 / 队尾可通过 key 随机访问
顺序模型FIFO 或 LIFO插入顺序,元素可在链表中移动
删除只能删队首可删除任意元素
典型场景消息队列、任务栈背包、排行榜

详见 ./coll-linked-map.md

注意点说明
必须在 Procedure 中操作所有读写必须在事务内
名称不能含 @@ 为内部保留分隔符
值必须继承 Bean并经 BeanFactory 注册
nodeSize 仅影响新节点已存在的旧节点容量不变
可混合 FIFO/LIFOadd/pollpush/pop 可交替使用
自动时间戳每个元素自动记录添加时间,无需业务自行维护