Uma fila é uma estrutura de dados linear com uma coleção de itens que segue o princípio primeiro a entrar, primeiro a sair (FIFO) ou prioriza elementos com base em critérios predefinidos. Armazenamentos na memória suportam dois tipos de fila, as filas regulares FIFO e as filas de prioridade. Ambos os tipos compartilham o mesmo conjunto de funções para inicializar uma fila vazia, adicionar dados à fila, ler dados da fila e remover dados da fila.
As filas de armazenamento na memória são úteis para processamento baseado em ordem e armazenar informações do usuário, como níveis de habilidade, para facilitar o pareamento com base nos critérios desejados. Por exemplo, você pode adicionar um lugar de lobby como o lugar inicial do seu jogo, usar filas de armazenamento na memória como um sistema centralizado de armazenamento de informações do usuário acessível por vários servidores, gerenciar a ordem de colocação dos usuários usando as filas e teleportar usuários que completaram o pareamento para o lugar principal do seu jogo.
Obter uma fila
Para obter uma fila, chame MemoryStoreService:GetQueue() com um nome, que é global dentro do jogo para qualquer script acessar, e um tempo limite de invisibilidade opcional em segundos, que impede o processamento duplicado do mesmo item da fila. O tempo limite de invisibilidade é de 30 segundos por padrão se você deixá-lo vazio, como no exemplo de código a seguir.
Obtendo uma Fila Vazialocal MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
Quando uma fila está processando um item nela, o tempo limite de invisibilidade se aplica ao item, tornando-o invisível para ser processado por outros servidores, já que vários servidores podem atualizar a fila simultaneamente. Embora se espere que tanto as operações de leitura quanto de remoção de um item sejam concluídas durante a duração do tempo limite de invisibilidade, se ocorrer um erro que faça o item permanecer na fila após o tempo limite expirar, os itens tornam-se visíveis para processamento novamente. Ao fazer isso, o tempo limite de invisibilidade garante que todos os itens de uma fila ainda possam ser processados, mesmo que ocorram problemas inesperados.
Depois de obter uma fila, chame qualquer uma das seguintes funções:
| Função | Ação |
|---|---|
| MemoryStoreQueue:AddAsync() | Adicionar um novo item à fila. |
| MemoryStoreQueue:ReadAsync() | Ler um ou mais itens da fila como uma única operação. |
| MemoryStoreQueue:RemoveAsync() | Remover um ou mais itens previamente lidos da fila. |
| MemoryStoreQueue:GetSizeAsync() | Obter o número de itens na fila. |
Adicionar dados
Para adicionar um novo item à fila, chame MemoryStoreQueue:AddAsync() com o valor do item, um tempo de expiração em segundos e uma prioridade opcional do item. Se você quiser manter sua fila na sequência FIFO, pode deixar a prioridade vazia ou passar 0.
Adicionando Dados a uma Fila
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
Ler e remover dados
Para ler um ou mais itens da fila ao mesmo tempo, chame MemoryStoreQueue:ReadAsync(), que retorna um id representando o item lido. Quando você terminar de processar os itens, chame imediatamente MemoryStoreQueue:RemoveAsync() para excluí-los da fila com seu id. Isso garante que você nunca processe um item mais de uma vez. Para capturar e responder a todos os itens que estão sendo continuamente adicionados a uma fila, inclua um loop como o seguinte exemplo de código:
Lendo e Removendo Dados da Fila com Loop
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
-- Loop de processamento da fila
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
Obter tamanho
Para obter o número de itens na fila, chame MemoryStoreQueue:GetSizeAsync(). Este método aceita um booleano opcional excludeInvisible. Quando ele é true, itens invisíveis são excluídos da contagem retornada. Esse booleano tem o padrão false.
Obtendo o Tamanho de uma Fila
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