Eine Warteschlange ist eine lineare Datenstruktur mit einer Sammlung von Elementen, die entweder das Prinzip "First-In-First-Out" (FIFO) befolgt oder Elemente basierend auf vordefinierten Kriterien priorisiert. Speicherdienste unterstützen zwei Arten von Warteschlangen, die FIFO regulären Warteschlangen und Prioritätswarteschlangen. Beide Typen teilen sich denselben Satz von Funktionen, um eine leere Warteschlange zu initialisieren, Daten zur Warteschlange hinzuzufügen, Daten aus der Warteschlange zu lesen und Daten aus der Warteschlange zu entfernen.
Speicherwarteschlangen sind nützlich für die bearbeitungsbasierte Verarbeitung und das Speichern von Benutzerinformationen, wie z. B. Fähigkeitsniveaus, um das Matchmaking basierend auf Ihren gewünschten Kriterien zu erleichtern. Beispielsweise können Sie einen Lobbyort als Startort Ihres Spiels hinzufügen, Speicherwarteschlangen als zentrales Speichersystem für Benutzerinformationen verwenden, auf das mehrere Server zugreifen können, die Platzierungsreihenfolge der Benutzer mithilfe der Warteschlangen verwalten und Benutzer, die das Matchmaking abgeschlossen haben, zum Hauptplatz Ihres Spiels teleportieren.
Eine Warteschlange erhalten
Um eine Warteschlange zu erhalten, rufen Sie MemoryStoreService:GetQueue() mit einem Namen auf, der global im Spiel für jedes Skript zugänglich ist, und einem optionalen Unsichtbarkeits-Timeout in Sekunden, das die doppelte Verarbeitung desselben Warteschlangenelements verhindert. Das Unsichtbarkeits-Timeout beträgt standardmäßig 30 Sekunden, wenn Sie es wie im folgenden Codebeispiel leer lassen.
Eine leere Warteschlange abrufenlocal MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
Wenn eine Warteschlange ein Element verarbeitet, gilt das Unsichtbarkeits-Timeout für das Element, wodurch es von anderen Servern unsichtbar gemacht wird, da mehrere Server die Warteschlange gleichzeitig aktualisieren können. Obwohl erwartet wird, dass sowohl Lese- als auch Löschvorgänge für ein Element während der Dauer des Unsichtbarkeits-Timeouts abgeschlossen werden, werden die Elemente nach Ablauf des Timeouts wieder sichtbar, wenn ein Fehler auftritt, der dazu führt, dass das Element in der Warteschlange bleibt. Durch dieses Verfahren gewährleistet das Unsichtbarkeits-Timeout, dass alle Elemente in einer Warteschlange weiterhin bearbeitet werden können, selbst wenn unerwartete Probleme auftreten.
Nachdem Sie eine Warteschlange erhalten haben, rufen Sie eine der folgenden Funktionen auf:
| Funktion | Aktion |
|---|---|
| MemoryStoreQueue:AddAsync() | Fügen Sie ein neues Element zur Warteschlange hinzu. |
| MemoryStoreQueue:ReadAsync() | Lesen Sie ein oder mehrere Elemente aus der Warteschlange als einen einzigen Vorgang. |
| MemoryStoreQueue:RemoveAsync() | Entfernen Sie ein oder mehrere zuvor aus der Warteschlange gelesene Elemente. |
| MemoryStoreQueue:GetSizeAsync() | Holen Sie sich die Anzahl der Elemente in der Warteschlange. |
Daten hinzufügen
Um ein neues Element zur Warteschlange hinzuzufügen, rufen Sie MemoryStoreQueue:AddAsync() mit dem Wert des Elements, einer Ablaufzeit in Sekunden und einer optionalen Priorität des Elements auf. Wenn Sie Ihre Warteschlange in der FIFO-Reihenfolge halten möchten, können Sie die Priorität leer lassen oder 0 übergeben.
Daten zu einer Warteschlange hinzufügen
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
Daten lesen und entfernen
Um ein oder mehrere Elemente gleichzeitig aus der Warteschlange zu lesen, rufen Sie MemoryStoreQueue:ReadAsync() auf, das eine id zurückgibt, die das gelesene Element darstellt. Wenn Sie mit der Verarbeitung der Elemente fertig sind, rufen Sie sofort MemoryStoreQueue:RemoveAsync() auf, um sie mit ihrer id aus der Warteschlange zu löschen. Dadurch wird sichergestellt, dass Sie ein Element niemals mehr als einmal verarbeiten. Um alle Elemente zu erfassen und darauf zu reagieren, die kontinuierlich zu einer Warteschlange hinzugefügt werden, schließen Sie eine Schleife wie im folgenden Codebeispiel ein:
Daten aus der Warteschlange mit Schleife lesen und entfernen
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
-- Warteschleifenverarbeitung
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
Größe abrufen
Um die Anzahl der Elemente in der Warteschlange zu erhalten, rufen Sie MemoryStoreQueue:GetSizeAsync() auf. Diese Methode nimmt ein optionales boolesches excludeInvisible. Wenn es true ist, werden unsichtbare Elemente von der zurückgegebenen Anzahl ausgeschlossen. Dieser boolesche Wert ist standardmäßig false.
Größe einer Warteschlange abrufen
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, sizeError = pcall(function()
size = queue:GetSizeAsync(true)
end)
if success then
print(size)
else
warn(sizeError)
end