Une file d'attente est une structure de données linéaire avec une collection d'éléments qui suit soit le principe du premier entré, premier sorti (FIFO), soit priorise les éléments en fonction de critères prédéfinis. Les magasins de mémoire supportent deux types de files d'attente, les files d'attente régulières FIFO et les files d'attente prioritaires. Les deux types partagent le même ensemble de fonctions pour initialiser une file d'attente vide, ajouter des données à la file, lire des données depuis la file et retirer des données de la file.
Les files d'attente du magasin de mémoire sont utiles pour le traitement basé sur l'ordre et pour stocker des informations utilisateur, telles que les niveaux de compétence, afin de faciliter le matchmaking en fonction de vos critères souhaités. Par exemple, vous pouvez ajouter un lieu de lobby comme lieu de départ de votre jeu, utiliser des files d'attente de magasin de mémoire comme un système de stockage centralisé d'informations utilisateur accessible par plusieurs serveurs, gérer l'ordre de placement des utilisateurs à l'aide des files d'attente, et téléporter les utilisateurs ayant terminé le matchmaking vers le lieu principal de votre jeu.
Obtenir une file d'attente
Pour obtenir une file d'attente, appelez MemoryStoreService:GetQueue() avec un nom, qui est global au sein du jeu pour que n'importe quel script puisse y accéder, et un délai d'invisibilité optionnel en secondes, qui empêche le traitement en double du même élément de la file. Le délai d'invisibilité est de 30 secondes par défaut si vous le laissez vide comme dans l'exemple de code suivant.
Obtenir une file d'attente videlocal MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
Lorsque une file d'attente traite un élément, le délai d'invisibilité s'applique à l'élément, le rendant invisible aux autres serveurs pour être traité, car plusieurs serveurs peuvent mettre à jour la file de manière concurrente. Bien qu'il soit prévu de terminer à la fois les opérations de lecture et de suppression pour un élément durant la durée du délai d'invisibilité, si une erreur se produit qui empêche l'élément de rester dans la file après l'expiration du délai, les éléments redeviennent visibles pour le traitement. En ce faisant, le délai d'invisibilité garantit que tous les éléments d'une file peuvent toujours être traités même si des problèmes inattendus se produisent.
Après avoir obtenu une file d'attente, appelez n'importe laquelle des fonctions suivantes :
| Fonction | Action |
|---|---|
| MemoryStoreQueue:AddAsync() | Ajouter un nouvel élément à la file. |
| MemoryStoreQueue:ReadAsync() | Lire un ou plusieurs éléments de la file en une seule opération. |
| MemoryStoreQueue:RemoveAsync() | Retirer un ou plusieurs éléments précédemment lus de la file. |
| MemoryStoreQueue:GetSizeAsync() | Obtenir le nombre d'éléments dans la file. |
Ajouter des données
Pour ajouter un nouvel élément à la file, appelez MemoryStoreQueue:AddAsync() avec la valeur de l'élément, un temps d'expiration en secondes, et une priorité optionnelle pour l'élément. Si vous souhaitez garder votre file dans la séquence FIFO, vous pouvez laisser la priorité vide ou passer 0.
Ajouter des données à une file d'attente
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
Lire et retirer des données
Pour lire un ou plusieurs éléments de la file d'attente à la fois, appelez MemoryStoreQueue:ReadAsync(), qui retourne un id représentant l'élément lu. Lorsque vous avez terminé de traiter les éléments, appelez immédiatement MemoryStoreQueue:RemoveAsync() pour les supprimer de la file avec son id. Cela garantit que vous ne traitez jamais un élément plus d'une fois. Pour capturer et répondre à tous les éléments qui sont continuellement ajoutés à une file, incluez une boucle comme dans l'exemple de code suivant :
Lire et retirer des données de la file d'attente avec une boucle
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
-- Boucle de traitement de la file
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
Obtenir la taille
Pour obtenir le nombre d'éléments dans la file, appelez MemoryStoreQueue:GetSizeAsync(). Cette méthode prend un booléen optionnel excludeInvisible. Lorsqu'il est true, les éléments invisibles sont exclus du comptage retourné. Ce booléen est par défaut false.
Obtenir la taille d'une file d'attente
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