Gestion des magasins de données

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Gérez vos données en utilisant la version, la liste et le cache.

Version

La version se produit lorsque vous définissez , mettez à jour et augmentez les données. Les fonctions 1> Class.GlobalDataStore:SetAsync()|SetAsync()1> , 4> Class.Global

Les sauvegardes en version bêta expirent 30 jours après la nouvelle écrasement écrit. La dernière version n'expire jamais.

Les fonctions suivantes effectuent des opérations de version :

FonctionDescription

ListVersionsAsync()

Liste toutes les versions pour une clé en retournant une instance DataStoreVersionPages que vous pouvez utiliser pour enumerer tous les numéros de version. Vous pouvez filtrer les versions en utilisant une plage de temps.

GetVersionAsync()

Récupère une version spécifique d'une clé en utilisant le numéro de version de la clé.

RemoveVersionAsync()

Supprime une version spécifique d'une clé.

Cette fonction crée également une version de tombstone tout en conservant la version précédente. Par exemple, si vous appelez RemoveAsync("User_1234") et que vous essayez ensuite de GetAsync("User_1234"), vous obtenez nil de retour

Vous pouvez utiliser la version pour gérer les demandes des utilisateurs. Si un utilisateur rapports qu'un problème s'est produit le 2020-10-09T01:42, vous pouvez rétablir les données à une version précédente en utilisant l'exemple suivant :


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)
-- Obtient la version la plus proche du temps donné
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
-- Lit la version la plus récente
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Restaure la valeur actuelle en la remplaçant par la plus récente
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Aucune entrée trouvée
end
end

Captures d'écran

La Snapshot Data Stores Open Cloud API vous permet de prendre une capture d'écran de tous les magasins de données dans une expérience une fois par jour. Avant de publier n'importe quelle mise à jour d'expérience qui change votre logique de stockage des données, assurez-vous de prendre une capture d'écran. Prendre une capture d'écran garantit que vous avez la dernière version disponible des données de l'expérience.

Par exemple, sans un snapshot, si vous publiez une mise à jour à 3:30 UTC qui cause une corruption de données, les données corrompées écrasent tout les données écrites entre 3:00-3:30 UTC. Si vous prenez un snapshot à 3:29 UTC, cependant, les données corrompées ne couvrent pas tout les données écrites avant 3:29 UTC, et les derniers données pour tous les clés écrites entre 3:00-

Listes et préfixes

Les magasins de données vous permettent de lister par préfixe. Par exemple, lorsque vous listez les premiers n caractères d'un nom, comme « d », « do » ou « dog » pour n'importe quelle clé ou magasin de données avec un préfixe « dog ».

Vous pouvez spécifier un préfixe lors de l'écriture de tous les magasins de données ou clés, et obtenir seulement les objets qui correspondent à ce préfixe. Les fonctions ListDataStoresAsync() et ListKeysAsync() retournent un objet DataStoreListingPages que vous

FonctionDescription
ListDataStoresAsync()Liste tous les magasins de données.
ListKeysAsync()Liste toutes les clés dans un boutiquede données.

Lunettes

Chaque clé dans un magasin de données a une portée globale par défaut. Vous pouvez organiser les clés plus loin en définissant une chaîne unique comme une portée pour le deuxième paramètre de GetDataStore() . Cela attache automatiquement la portée au début de toutes les opérations effectuées sur le boutiquede données.

CléLunette
houses/User_1234maisons
pets/User_1234animaux de compagnie
inventory/User_1234inventaire

La combinaison du nom du stockage de données, de la portée et de la clé uniquement identifie une clé. Tous les trois valeurs sont requises pour identifier une clé avec une portée. Par exemple, vous pouvez lire une clé nommée User_1234 comme :


local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)

Si la clé User_1234 a un champ de vision d'or, vous ne pouvez la lire que comme :


local DataStoreService = game:GetService("DataStoreService")
local inventoryStore = DataStoreService:GetDataStore("PlayerInventory", "gold")
local success, currentGold = pcall(function()
return inventoryStore:GetAsync("User_1234")
end)

Toutes les propriétés Scopes

DataStoreOptions contient une propriété AllScopes qui vous permet de renvoyer des clés à partir de tous les

Lorsque vous utilisez la propriété AllScopes, le deuxième paramètre de Class.DataStoreService:GetDataStore() doit être une chaîne vide ( "" ).


local DataStoreService = game:GetService("DataStoreService")
local options = Instance.new("DataStoreOptions")
options.AllScopes = true
local ds = DataStoreService:GetDataStore("DS1", "", options)

Si vous activez la propriété AllScopes et créez une nouvelle clé dans le data boutique, vous devez toujours spécifier un champ de vision pour cette clé dans le format de scope/keyname. Si vous ne le faites pas, les API s'affichent en erreur. Par exemple, gold/player_34545 est acceptable avec l'or comme champ

global/K1house/K1
global/L2house/L2
global/M3house/M3

Cache

Utilisez le stockage temporaire pour stocker temporairement les données des magasins de données pour améliorer les performances et réduire le nombre de demandes faites au serveur. Par exemple, une expérience peut stocker une copie de ses données afin qu'elle puisse accéder à ceux-ci rapidement sans avoir à faire un autre appel au boutiquede données.

Le cache s'applique aux modifications que vous apportez aux clés de stockage de données en utilisant :

GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() et 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> ne implémentent pas la mise en cache et

Par défaut, le moteur utilise GetAsync() pour stocker les valeurs que vous récupérez du backend dans un cache local pendant quatre secondes. Par défaut, les demandes GetAsync() pour les clés en

Tous les appels GetAsync() qui récupèrent une valeur qui n'est pas mise en cache du serveur de mise à jour la cache immédiatement et redémarrer le minuteur de quatre secondes.

Désactivage du caching

Pour désactiver le cache et opt out of using the cache to retrieve the most up-to-date value from the serveurs, add the DataStoreGetOptions parameter to your GetAsync() call and set the UseCache property to 2> false2> to make your request ignore any keys in the cache.

Désactiver le cache est utile si vous avez plusieurs serveurs qui écrire à une clé avec une fréquence élevée et besoin de obtenir la dernière valeur des serveurs. Cependant, il peut vous causer à consommer plus de vos limites de stores de données et quotas, car les demandes Class.GlobalDataStore:GetAsync()|GetAsync() dépassent toujours le throughput et les limites de votre serveur.

Serialisation

Le DataStoreService stocke les données au format JSON. Lorsque vous enregistrez des données Lua dans Studio, Roblox utilise un processus appelé serialisation pour convertir ces données en JSON pour les enregistrer dans les magasins de données. Roblox convertit ensuite vos données en Lua et vous les renvoie dans un autre processus appelé désynchronisation.

La serialisation et la déserialisation prend en charge les types de données Lua suivants :

  • Numéros
    • Vous ne devriez pas stocker les valeurs numériques spéciales inf , -inf et nan, car ces valeurs ne sont pas conformes aux normes JSON. Vous ne pouvez pas accéder aux clés qui contiennent ces valeurs avec Open Cloud.
  • Tables
    • Les tables ne doivent contenir que d'autres types de données pris en charge
    • Les clés numériques sont traduites en chaînes si la longueur de la table est 0

Si vous essayez de stocker un type de données que la serialisation ne prend pas en assistance, vous avez l'un des éléments suivants :

  • Échec de la sauvegarde de ce type de données et affichage d'une message.
  • Réussissez à stocker ce type de données en tant que nil .

Pour déboguer pourquoi votre type de données est stocké en tant que nil , vous pouvez utiliser la fonction JSONEncode. Lorsque vous passez votre type de données Lua dans cette fonction, vous le recevez de retour dans le format Roblox qui aurait stocké avec des magasins de données, ce qui vous permet de prévisualiser et d'investiguer les données renvoyées.