Gere seus dados usando versão, listagem e armazenamento.
Versão
Versão ocorre quando você define, atualiza e incrementa dados. As funções 2> Class.GlobalDataStore:SetAsync()|SetAsync()2> , 5> Class.GlobalDataStore:UpdateAsync()|UpdateAsync
Versões anteriores de backups expiram 30 dias após uma nova escrita sobrescrevê-los. A versão mais recente nunca expira.
As seguintes funções executam operações de versão:
Função | Descrição |
---|---|
Lista todas as versões para uma chave, retornando uma instância DataStoreVersionPages que você pode usar para contar todos os números de versão. Você pode filtrar versões usando um range de tempo. | |
Busca uma versão específica de uma chave usando o número de versão da chave. | |
Exclui uma versão específica de uma chave. Essa função também cria uma versão de tombstone ao manter a versão anterior. Por exemplo, se você chamar RemoveAsync("User_1234") e, em seguida, tentar chamar GetAsync("User_1234"), você receberá |
Você pode usar versão para lidar com solicitações de usuários. Se um usuário relatar que um problema ocorreu em 2020-10-09T01:42, você pode reverter dados para uma versão anterior usando o seguinte exemplo:
local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local DATA_STORE_KEY = "User_1234"
local maxDate = DateTime.fromUniversalTime(2020, 10, 09, 01, 42)
-- Obtém a versão mais próxima do tempo fornecido
local listSuccess, pages = pcall(function()
return experienceStore:ListVersionsAsync(DATA_STORE_KEY, Enum.SortDirection.Descending, nil, maxDate.UnixTimestampMillis)
end)
if listSuccess then
local items = pages:GetCurrentPage()
if #items > 0 then
-- Lê a versão mais recente
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Restaura o valor atual ao substituí-lo pela versão mais recente
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Nenhuma entrada encontrada
end
end
Rastros
A Snapshot Data Stores Open Cloud API permite que você faça uma cópia de instantâneo de todos os armazenamentos de dados em uma experiência uma vez por dia. Antes de publicar qualquer atualização de experiência que muda sua lógica de armazenamento de dados, certifique-se de fazer uma cópia de instantâneo. Tomar uma cópia de instantâneo garante que você tenha o mais recente dado disponível da versão anterior da experiência.
Por exemplo, sem um instantâneo, se você publicar uma atualização às 3:30 UTC que cause corrupção de dados, os dados corrompidos substituem qualquer dado escrito entre 3:00-3:30 UTC. Se você fazer uma captura de tela em 3:29 UTC, no entanto, os dados corrompidos não substituem nenhum dado escrito antes de 3:29 UTC, e os dados mais recentes para todas
Lista e Prefixos
Armazenamento de dados permite que você liste por prefixo. Por exemplo, listar por primeiro n caracteres de um nome, como "d" , "do" ou "cachorro" para qualquer armazenamento de chave ou armazenamento de dados com um prefixo de "cachorro".
Você pode especificar um prefixo ao listar todos os armazenamentos de dados ou chaves, e obter de volta apenas objetos que correspondam a esse prefixo. Ambas as funções Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync() e Class.DataStoreListingPages retornam um objeto que você pode usar para listar a lista.
Função | Descrição |
---|---|
ListDataStoresAsync() | Lista todos os armazenamentos de dados. |
ListKeysAsync() | Lista todas as chaves em um lojade dados. |
Escopos
Cada chave em um armazenamento de dados tem um alcance global padrão. Você pode organizar chaves ainda mais ao configurar uma única string como uma escopo para o segundo parâmetro de GetDataStore() . Isso atesta automaticamente o alcance ao início de todas as chaves em todas as operações feitas no lojade dados.
Chave | Mira |
---|---|
houses/User_1234 | casas |
pets/User_1234 | animais de estimação |
inventory/User_1234 | inventário |
A combinação de nome do armazenamento de dados, escopo e chave identifica exclusivamente uma chave. Todos os três valores são necessários para identificar uma chave com um escopo. Por exemplo, você pode ler uma chave global chamada User_1234 como:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Se a chave User_1234 tiver um alcance de ouro, porém, você só pode lê-la como:
local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)
Propriedade Todos os Óculos
DataStoreOptions contém uma propriedade AllScopes que permite que você retorne chaves de todos os
Quando você usa a propriedade AllScopes, o segundo parâmetro de GetDataStore() deve ser uma string vazia ( "" ).
local DataStoreService = game:GetService("DataStoreService")local options = Instance.new("DataStoreOptions")options.AllScopes = truelocal ds = DataStoreService:GetDataStore("DS1", "", options)
Se você habilitar a propriedade AllScopes e criar uma nova chave no armazenamento de dados, você deve sempre especificar uma escopo para essa chave no formato de escopo/nome de chave. Se você não, as APIs apresentarão um erro. Por exemplo, gold/player_3
global/K1 | house/K1 |
global/L2 | house/L2 |
global/M3 | house/M3 |
Cacheando
Use o armazenamento temporário para armazenar dados dos armazenamentos de dados para melhorar o desempenho e reduzir o número de solicitações feitas ao servidor. Por exemplo, uma experiência pode armazenar uma cópia de seus dados para que ela possa acessar esse dado rapidamente sem ter que fazer outra chamada para o lojade dados.
O armazenamento de aplicativos se aplica às modificações que você faz nas chaves do armazenamento de dados usando:
- GetAsync() para ler dados .
- SetAsync() para criar dados .
- UpdateAsync() para atualizar dados .
- RemoveAsync() para remover dados .
GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() e 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> não implementam cache e sempre buscam o último d
Por padrão, o motor usa GetAsync() para armazenar valores que você recupera do backend em um cache local por quatro segundos. Além disso, GetAsync() solicitações
Todos os Class.GlobalDataStore:GetAsync()|GetAsync() chamadas que recuperam um valor não armazenado do lado de dados do back-end atualizam o cache imediatamente e reiniciam o timer de quatro segundos.
Desabilitando o armazenamento em cache
Para desativar o armazenamento em cache e optar por não usar o armazenamento em cache para recuperar o valor mais recente dos servidores, adicione o parâmetro DataStoreGetOptions ao seu Class.GlobalDataStore:GetAsync()|GetAsync() chamada e configure a propriedade Class.DataStoreGetOptions.UseCache para 2> true</
Desativar o armazenamento em cache é útil se você tiver vários servidores escrevendo para uma chave com alta frequência e precisar obter o último valor dos servidores. No entanto, pode causar que você consuma mais de seus limites e quotas de armazenamento de dados Class.GlobalDataStore:GetAsync()|GetAsync(), pois solicitações Class.GlobalDataStore:GetAsync()|GetAsync() sempre contam para sua produção e limites de servidores.
Serialização
O DataStoreService armazena dados em formato JSON. Quando você salva dados Lua no Studio, o Roblox usa um processo chamado serialização para convertê-los em JSON para salvá-los em armazenamentos de dados. O Roblox então converte seus dados de volta para Lua e retorna-os para você em um outro processo chamado deserialização.
Serialização e deserialização suportam os seguintes tipos de dados Lua:
- Números
- Você não deve armazenar os valores numericos especiais inf, -inf e nan, pois estes valores não são conformes com os padrões JSON. Você não pode acessar chaves que contêm estes valores com o Open Cloud.
- Tabelas
- As tabelas só podem conter outros tipos de dados suportados
- Chaves numéricas são traduzidas em caracteres se a longura da tabela for 0
Se você tentar armazenar um tipo de dado que serialização não Suporte, você pode:
- Falha ao armazenar esse tipo de dado e receba uma mensagem de erro.
- Tenha sucesso ao armazenar esse tipo de dado como nil .
Para debugar por que seu tipo de dado está sendo armazenado como nil, você pode usar a função JSONEncode. Quando você passa seu tipo de dado Lua nesta função, você recebê-lo de volta no formato Roblox que armazenaria dados, o que permite que você pré-visualize e investigue os dados retornados.