MemoryStoreQueue
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
Fornisce l'accesso a una coda all'interno di MemoryStore.Una coda è una struttura di dati che fornisce uno storage temporaneo per oggetti arbitrari (fino alla dimensione massima dell'oggetto -- vedi Limitazioni di MemoryStore).Ogni elemento della coda ha una priorità numerica: MemoryStore recupera prima gli elementi con priorità più alta dalla coda, e recupera gli elementi con la stessa priorità in ordine di aggiunta.
Gli elementi in coda possono essere opzionalmente impostati per scadere dopo un certo periodo di tempo.Gli elementi scaduti scompaiono semplicemente dalla coda come se non fossero mai stati aggiunti.
Sommario
Proprietà
Metodi
Aggiunge un oggetto alla coda.
Legge uno o più elementi dalla coda.
Rimuove un oggetto o oggetti precedentemente letti dalla coda.
Proprietà
Metodi
AddAsync
Aggiunge un oggetto alla coda.
Parametri
Il valore dell'elemento da aggiungere alla coda.
Tempo di scadenza dell'elemento, in secondi, dopo il quale l'elemento verrà automaticamente rimosso dalla coda.
Priorità dell'elemento. Gli elementi con priorità più alta vengono recuperati dalla coda prima degli elementi con priorità più bassa.
Restituzioni
ReadAsync
Legge uno o più elementi dalla coda come un'unica operazione atomica.
Questo metodo non elimina automaticamente gli elementi restituiti dalla coda ma li rende invisibili ad altre chiamate ReadAsync per il periodo del timeout dell'invisibilità.Gli elementi devono essere rimossi esplicitamente dalla coda con MemoryStoreQueue:RemoveAsync() prima che scada il tempo limite dell'invisibilità.L'invio del timeout dell'invisibilità predefinisce 30 secondi a meno che un valore diverso non sia stato fornito in MemoryStoreService:GetQueue() .
Parametri
Numero di elementi da leggere. Il valore massimo consentito di questo parametro è 100.
Controlla il comportamento del metodo nel caso in cui la coda abbia meno di count oggetti: se impostato su false, il metodo restituisce tutti gli oggetti disponibili; se impostato su true, non restituisce oggetti.Il valore predefinito è falso.
La durata, in secondi, per la quale il metodo attenderà se il numero richiesto di oggetti non è immediatamente disponibile nella coda.Le letture vengono tentate ogni due secondi durante questo periodo.Questo parametro può essere impostato a zero per indicare nessuna attesa.Se questo parametro non viene fornito o impostato su -1, il metodo attenderà indefinitamente.
Restituzioni
Un tuple di due elementi.Il primo elemento è un array di valori di oggetto letti dalla coda.Il secondo elemento è un identificatore di stringa che deve essere passato a MemoryStoreQueue:RemoveAsync() per rimuovere definitivamente questi elementi dalla coda.
Campioni di codice
The following code sample demonstrates using MemoryStoreQueue:ReadAsync() and MemoryStoreQueue:RemoveAsync() to reliably read, process, and remove items from a queue. Though this process can be as complicated as necessary, this example simply sets a flag in the corresponding data store item, which guarantees that every item will eventually be processed even if some of the calls encounter errors or the server crashes:
- If MemoryStoreQueue:ReadAsync() fails, no items are retrieved from the queue. An item will be picked up for processing during the next iteration of the loop.
- If MemoryStoreQueue:ReadAsync() succeeds but DataStoreService:UpdateAsync() fails, the item stays invisible until the queue's invisibility timeout expires, causing the item becoming visible again to be returned in a future loop iteration.
- Similarly, if MemoryStoreQueue:RemoveAsync() fails, the item will become visible again in the future and will be processed again.
Depending on where the failure happens, it's possible that an item will be processed more than once. You should account for that like the following code sample, in which the end result is the same even if DataStoreService:UpdateAsync() is invoked multiple times.
local MemoryStoreService = game:GetService("MemoryStoreService")
local DataStoreService = game:GetService("DataStoreService")
local queue = MemoryStoreService:GetQueue("PlayerQueue")
local dataStore = DataStoreService:GetDataStore("PlayerStore")
while true do
pcall(function()
-- wait for an item to process
local items, id = queue:ReadAsync(1, false, 30)
-- check if an item was retrieved
if #items > 0 then
-- mark the item as processed
dataStore:UpdateAsync(items[0], function(data)
data = data or {}
data.processed = 1
return data
end)
-- remove the item from the queue
queue:RemoveAsync(id)
end
end)
end
RemoveAsync
Rimuove un oggetto o oggetti precedentemente letti dalla coda.Questo metodo utilizza l'identificatore restituito da MemoryStoreQueue:ReadAsync() per identificare gli elementi da Rimuovere.Se chiamato dopo che il tempo limite dell'invisibilità è scaduto, la chiamata non ha alcun effetto.
Parametri
Identifica gli elementi da Eliminare. Usa il valore restituito da MemoryStoreQueue:ReadAsync() .
Restituzioni
Campioni di codice
The following code sample demonstrates using MemoryStoreQueue:ReadAsync() and MemoryStoreQueue:RemoveAsync() to reliably read, process, and remove items from a queue. Though this process can be as complicated as necessary, this example simply sets a flag in the corresponding data store item, which guarantees that every item will eventually be processed even if some of the calls encounter errors or the server crashes:
- If MemoryStoreQueue:ReadAsync() fails, no items are retrieved from the queue. An item will be picked up for processing during the next iteration of the loop.
- If MemoryStoreQueue:ReadAsync() succeeds but DataStoreService:UpdateAsync() fails, the item stays invisible until the queue's invisibility timeout expires, causing the item becoming visible again to be returned in a future loop iteration.
- Similarly, if MemoryStoreQueue:RemoveAsync() fails, the item will become visible again in the future and will be processed again.
Depending on where the failure happens, it's possible that an item will be processed more than once. You should account for that like the following code sample, in which the end result is the same even if DataStoreService:UpdateAsync() is invoked multiple times.
local MemoryStoreService = game:GetService("MemoryStoreService")
local DataStoreService = game:GetService("DataStoreService")
local queue = MemoryStoreService:GetQueue("PlayerQueue")
local dataStore = DataStoreService:GetDataStore("PlayerStore")
while true do
pcall(function()
-- wait for an item to process
local items, id = queue:ReadAsync(1, false, 30)
-- check if an item was retrieved
if #items > 0 then
-- mark the item as processed
dataStore:UpdateAsync(items[0], function(data)
data = data or {}
data.processed = 1
return data
end)
-- remove the item from the queue
queue:RemoveAsync(id)
end
end)
end