内存存储队列

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

一个 队列 是一种线性数据结构,包含一个或多个项目,其中一个或多个项目遵循FIFO原则或基于预定义标准优先级排序元素。内存存储支持两种类型的队列,FIFO 常规队列优先级队列。两种类型都共享初始化空队列、将数据添加到队列、阅读队列数据和从队列中删除数据的相同集功能。

内存存储队列对于基于订单的处理和存储用户信息,例如技能等级,有助于根据您的筛选条件进行匹配。例如,你可以将大厅地点添加为体验的起点,使用内存存储队列作为分布式用户信息存储系统,管理使用队列的用户放置顺序,并将完成匹配的用户传送到体验的主地点。

获取队列

要获取队列,请拨打 MemoryStoreService:GetQueue() 并使用 名称 ,该名称在体验中是全球的,任何脚本都可以1) 使用权 2)通行证 3)访问权限,以及在秒内可选的 隐形时间限制 ,可防止同一队列项物品的重复处理。默认情况下,隐形时间限制为 30 秒,如果您像以下代码示例一样将其留空。

获取空队列

local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")

当队列正在处理其中的物品时,隐形时间限制适用于该物品,使其从其他服务器处理中隐形,因为多个服务器可以同时更新队列。虽然期望在隐身时间期间完成项目的阅读和移除操作,但如果出现错误导致项目在时间过期后仍留在队列中,那么项目在处理过程中又会变得可见。在这样做时,隐形时间限制保证队列中的所有项目仍然可以处理,即使出发生意外问题。

在获取队列后,调用以下任意函数来在其中阅读或写入数据:

函数行动
MemoryStoreQueue:AddAsync()添加 一个新项目到队列。
MemoryStoreQueue:ReadAsync()阅读 队列中的一个或多个项目作为单个操作。
MemoryStoreQueue:RemoveAsync()移除 一个或多个以前从队列中阅读的项目。

添加数据

要将新物品添加到队列中,请调用 MemoryStoreQueue:AddAsync() 并将物品值、过期时间(秒)和可选物品优先级传递给队列。如果您想将队列保留在 FIFO 顺序中,您可以将优先级为空或传递 0

将数据添加到队列

local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("User_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end

阅读并删除数据

要一次读取队列中的一个或多个项目,请调用 MemoryStoreQueue:ReadAsync() , 该方法将返回一个 id 代表读取项目的对象。当你完成处理项目时,立即调用 MemoryStoreQueue:RemoveAsync() 将它们从队列中删除,使用其 id 。这可确保您永远不会处理一个物品超过一次。要捕获并回应所有连续添加到队列的项目,请包含一个 循环 像以下代码示例一样:

使用循环阅读和从队列中删除数据

local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
queue:AddAsync("User_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
-- 队列处理循环
while true do
local readSuccess, items, id = pcall(function()
return queue:ReadAsync(1, false, 30)
end)
if not readSuccess then
task.wait(1)
elseif #items > 0 then
print(items, id)
local removeSuccess, removeError = pcall(function()
queue:RemoveAsync(id)
end)
if not removeSuccess then
warn(removeError)
end
end
end