一个 队列 是一种线性数据结构,它包含一系列项目,可以遵循先进先出(FIFO)原则,或根据预定义的标准对元素进行优先级排序。 内存存储 支持两种类型的队列,FIFO 常规队列 和 优先级队列。这两种类型共享相同的一组函数,用于初始化一个空队列、向队列中添加数据、从队列中读取数据以及从队列中删除数据。
内存存储队列对于基于顺序的处理和存储用户信息(例如技能等级)非常有用,以便根据您的期望标准促进匹配。例如,您可以将一个大厅地点作为您游戏的起始地点,使用内存存储队列作为一个集中式用户信息存储系统,多个服务器可访问,使用队列来管理用户的放置顺序,并将已完成匹配的用户传送到您游戏的主地点。
获取队列
要获取队列,请调用 MemoryStoreService:GetQueue(),并提供一个 名称,该名称在游戏中是全局的,任何脚本都可以访问,以及一个可选的 不可见超时(秒),其防止对相同队列项的重复处理。如果您将其留空,则不可见超时默认为 30 秒,以下代码示例展示了这一点。
获取一个空队列local MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
当队列正在处理其中的某个项目时,不可见超时适用于该项目,使其在被其他服务器处理时变得不可见,因为多个服务器可以并发更新队列。尽管预计在不可见超时持续期间完成对一个项目的读取和删除操作,但如果发生错误导致项目在超时过后仍保留在队列中,项目将再次变为可见进行处理。通过这种方式,不可见超时确保即使发生意外问题,队列中的所有项目仍然可以被处理。
获取队列后,可以调用以下任一函数:
| 函数 | 操作 |
|---|---|
| MemoryStoreQueue:AddAsync() | 添加 一个新项目到队列。 |
| MemoryStoreQueue:ReadAsync() | 读取 一个或多个项目作为单个操作。 |
| MemoryStoreQueue:RemoveAsync() | 移除 之前从队列读取的一个或多个项目。 |
| MemoryStoreQueue:GetSizeAsync() | 获取 队列中项目的数量。 |
添加数据
要向队列中添加一个新项目,请调用 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
获取大小
要获取队列中项目的数量,请调用 MemoryStoreQueue:GetSizeAsync()。该方法接受一个可选的布尔值 excludeInvisible。当它为 true 时,返回的计数中将排除不可见的项目。这个布尔值默认值为 false。
获取队列的大小
local MemoryStoreService = game:GetService("MemoryStoreService")
local queue = MemoryStoreService:GetQueue("Queue1")
local addSuccess, addError = pcall(function()
return queue:AddAsync("User_1234", 30, 1)
end)
if not addSuccess then
warn(addError)
end
local size
local success, sizError = pcall(function()
size = queue:GetSizeAsync(true)
end)
if success then
print(size)
else
warn(sizeError)
end