Uma fila é uma estrutura de dados lineares com uma coleção de itens que segue o princípio de primeiro a entrar, primeiro a sair (FIFO) ou prioriza elementos com base em critérios pré-definidos .Armazenamentos de memória suportam dois tipos de fila, a FIFO filas regulares e filas prioritárias.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 de memória são úteis para processamento e armazenamento baseados em ordem e para armazenar informações do usuário, como níveis de habilidade, para facilitar a busca de correspondência com base nos critérios desejados.Por exemplo, você pode adicionar um local de sala como o local de início de sua experiência, usar filas de armazenamento de memória como um sistema de armazenamento de informações de usuário centralizado acessível por múltiplos servidores, gerenciar a ordem de colocação de usuários usando as filas e teletransportar o usuário que completou o matchmaking para o local principal de sua experiência.
Obtenha uma fila
Para obter uma fila, chame MemoryStoreService:GetQueue() com um nome , que é global dentro da experiência para qualquer script acesso, e um tempo de espera opcional de invisibilidade 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 o seguinte exemplo de código.
Obtendo uma fila vazia
local MemoryStoreService = game:GetService("MemoryStoreService")local queue = MemoryStoreService:GetQueue("Queue1")
Quando uma fila está processando um item nela, o limite de tempo de invisibilidade se aplica ao item, tornando-o invisível de ser processado por outros servidores, pois vários servidores podem atualizar a fila simultaneamente.Embora seja esperado concluir as operações de leitura e remoção para um item durante a duração do tempo de espera de invisibilidade, se ocorrer um erro que cause o item permanecer na fila após o tempo de espera expirar, os itens se tornam visíveis para processamento novamente.Ao fazer isso, o limite de tempo de invisibilidade garante que todos os itens em uma fila ainda possam ser processados, mesmo que ocorram problemas inesperados.
Depois de obter uma fila, chame qualquer uma das seguintes funções para ler ou escrever dados nela:
Função | Ação |
---|---|
MemoryStoreQueue:AddAsync() | Adicionar um novo item na fila. |
MemoryStoreQueue:ReadAsync() | Leia um ou mais itens da fila como uma única operação. |
MemoryStoreQueue:RemoveAsync() | Remover um ou mais itens lidos anteriormente da fila. |
Adicionar dados
Para adicionar um novo item na 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, você 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
Leia e remova dados
Para ler um ou mais itens da fila de uma só vez, chame MemoryStoreQueue:ReadAsync() , que retorna um id representando o item lido.Quando você terminar de processar 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 adicionados continuamente 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
-- Ciclo de processamento de 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