一個 隊列 是一個線性數據結構,包含一組項目,其中一些遵循FIFO原則或基於預定義的標準優先排序元素。記憶體儲存支持兩種類型的隊列,FIFO普通隊列和優先級隊列。兩種類型都共享初始化空隊列、將數據添加到隊列、閱讀隊列數據和從隊列中移除數據的相同功能集。
記憶體儲存隊列對於基於訂單的處理和儲存用戶信息,例如技能等級,有助於根據您所需的條件進行匹配。例如,您可以將大廳地點添加為體驗的起點,使用記憶存儲隊列作為多個伺服器可訪問的中央化用戶資訊存儲系統,管理使用隊列的用戶放置順序,並將完成匹配的用戶傳送到體驗的主要地點。
取得隊列
要取得隊列,請呼叫 MemoryStoreService:GetQueue() 使用 名稱 ,該名稱在體驗中是全球的,任何腳本都可以使用權 通行權 存取,並有可選的 隱形時間限制 在秒鐘內,這將防止同一隊列項道具的重複處理。如果您以下列代碼樣本的空白方式留下它,則隱形時間限制為 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