一個 佇列 是一種線性資料結構,具有一組項目,遵循先進先出(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