Zarządzanie magazynem danych

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Zarządzaj danymi za pomocą wersji, listy i zapisu.

Wersjonowanie

Aktualizacja wersji zdarza się, gdy ustawisz set, aktualizuj i zwiększ dane. Funkcje 2> Class.GlobalDataStore:SetAsync()|SetAsync()2> , 5>

Zarchiwizowane zapiski wygasają po 30 dniach od ponownego zapisu. Nowsza wersja zapisków nigdy się nie wygasa.

Następujące funkcje wykonują operacje wersji:

FunkcjaOpis

ListVersionsAsync()

Lista wszystkich wersji dla klucza, zwracając instancję DataStoreVersionPages, którą możesz użyć do liczenia wszystkich liczb wersji. Możesz filtrować wersje używając zakresu czasowego.

GetVersionAsync()

Odzyskuje określoną wersję klucza używając numery wersji klucza.

RemoveVersionAsync()

Usuwa określoną wersję klucza.

Funkcja ta tworzy również wersję nagrobka, gdy utrzymuje poprzednią wersję. Na przykład, jeśli nazwiesz RemoveAsync("User_1234") i następnie spróbujesz nazwać GetAsync("User_12

Możesz użyć wersji, aby zarządzać wnioskami użytkowników. Jeśli użytkownik zgłasza, że problem nastąpił w dniu 2020-10-09T01:42, możesz przywrócić dane do poprzedniej wersji używając następuющеgo przykładu:


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)
-- Dostaje najbliższą datę wersji
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
-- Czyta najbliższą wersję
local closestEntry = items[1]
local success, value, info = pcall(function()
return experienceStore:GetVersionAsync(DATA_STORE_KEY, closestEntry.Version)
end)
-- Przywraca bieżącą wartość poprzez przeciągnięcie jej do najbliższej wersji
if success then
local setOptions = Instance.new("DataStoreSetOptions")
setOptions:SetMetadata(info:GetMetadata())
experienceStore:SetAsync(DATA_STORE_KEY, value, nil, setOptions)
end
else
-- Nie znaleziono wyników
end
end

Zdjęcia

Snapshot Data Stores Open Cloud API umożliwia cię zrobienie zdjęcia ekranu wszystkich przechowywanych danych w doświadczeniu raz dzien. Przed opublikowaniem dowolnej aktualizacji przechowywania danych, która zmienia twoją logikę przechowywania danych, upewnij się, że zrobiłeś zdjęcie ekranu. Zdjęcie ekranu gwarantuje, że masz najnowsze dane dostępne z poprzedniego wersji

Na przykład, bez zdjęcia wersji, jeśli opublikujesz aktualizację o 3:30 UTC, która powoduje uszkodzenie danych, uszkodzone dane piszą wszystkie dane napisane między 3:00-3:30 UTC. Jeśli jednak zrobisz zdjęcie wersji w 3:29 UTC, to uszkodzone dane nie piszą nic napisanych między 3:00-

Listy i prefiksy

Magazyny danych pozwalają na listowanie według prefiksu. Na przykład, listowanie według pierwszych n znaków imienia, takich jak "d" lub "do" dla dowolnego klucza lub magazynu danych z prefixem "dog".

Możesz określić prefiks, gdy wymieniasz wszystkie magazyny danych lub klucze, i wrócić tylko do obiektów, które odpowiadają temu prefiksowi. Zarówno ListDataStoresAsync() i ListKeysAsync() funkcje zwracają obie

FunkcjaOpis
ListDataStoresAsync()Listuje wszystkie magazyny danych.
ListKeysAsync()Listuje wszystkie klucze w sklepdanych.

Zakresy

Każdy klucz w magazynie danych ma domyślną globalną skalę. Możesz zorganizować klucze dalej poprzez ustawienie unikalnej wartości jako skalę dla drugiego parametru GetDataStore() . To automatycznie przywiązuje skalę na początek wszystkich kluczy w wszystkich operacjach wykonanych na danych.

KluczZakres
houses/User_1234domy
pets/User_1234zwierzęta
inventory/User_1234wyposażenie

Kompozycja nazwy magazynu danych, zakresu i klucza unikalnie identyfikuje klucz. Wszystkie trzy wartości są wymagane do identyfikacji klucza z zakresem. Na przykład, możesz czytać globalny klucz nazyający się User_1234 jako:


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

Jeśli klucz User_1234 ma zakres złota, możesz go czytać tylko jako:


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

Wszystkie oskopowe właściwości

DataStoreOptions zawiera właściwość AllScopes, która pozwala na zwracanie kluczy z wsz

Gdy używasz właściwości AllScopes, drugi parametr Class.DataStoreService:GetDataStore()|GetDataStore() musi być pustą wartością ( "" ).


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

Jeśli włączysz właściwość AllScopes i utworzysz nowy klucz w magazynie danych, musisz zawsze określić zakres dla tej wartości w formie scope/keyname. Jeśli nie, API wyświetla błąd. Na przykład, gold/player_34545

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

Cacheowanie

Użyj kachingu, aby tymczasowo przechowywać dane z magazynów danych, aby poprawić wydajność i zmniejszyć liczbę wniosków wysyłanych na serwer. Na przykład doświadczenie może przechować kopię swoich danych, aby móc szybko uzyskać dostęp do tych danych bez konieczności ponownego wezwania do sklepdanych.

Kaching stosuje się do zmian, które dokonujesz w kluczach magazynu danych przy użyciu:

GetVersionAsync() , ListVersionsAsync() , ListKeysAsync() i 0> Class.DataStoreService:ListDataStoresAsync()|ListDataStoresAsync()0> nie wdrożone wtyczki pamię

Domyślnie silnik używa GetAsync() , aby przechować wartości, które odzyskujesz z boku serwera w lokalnej pamięci, przez cztery sekundy. Również domyślnie, Class.Global

Wszystkie GetAsync() wezwania, które odczytują wartość nieprzechowywanych z aktualizacji back-end, natychmiastowo odczytują pamięć i ponownie uruchomują czteromiesięczny odliczacz czasu.

Wyłączanie podszycia

Aby wyłączyć kaching i zrezygnować z używania cache, aby odzyskać najnowszą wartość z serwerów, dodaj parametr DataStoreGetOptions do swojego wezwania GetAsync() i ustaw właściwość UseCache na

Wyłączenie kachingu jest użyteczne, jeśli masz wiele serwerów, które pisać do klucza z dużą częstotliwością i potrzebujesz uzyskać najnowszą wartość z serwerów. Jest to jednak może powodować, że konsumujesz więcej swoich przechowywanie danych limity i kwoty, ponieważ Class.GlobalDataStore:GetAsync()|GetAsync() zawsze omiń k

Serializacja

Class.DataStoreService przechowuje dane w formacie JSON. Gdy zapiszesz dane Lua w Studio, Roblox używa procesu zwanego serializacją, aby przekonwertować te dane w JSON, aby zapisać je w magazynach danych. Następnie Roblox konwertuje twoje dane z powrotem do Lua i wysyła je do ciebie w innym procesie zwanym deseryralizacją.

Serializacja i odseryalizacja wspierają następujące rodzaje danych Lua:

  • Liczby
    • Nie powinieneś przechowywać specjalnych wartości liczbowych inf, -inf i nan, ponieważ te wartości nie zgodzą się z wymaganiami JSON. Nie możesz uzyskać dostępu do kluczy, które zawierają te wartości z Open Cloud.
  • Tabela
    • Tabela musi zawierać tylko inne wymaganymi typy danych
    • Liczby kluczy są przetłumaczane na struny, jeśli długość tabeli wynosi 0

Jeśli próbujesz przechować dany typ danych, którego nie wspiera serweryzacja, to:

  • Nie udało się zapisać tego typu danych i otrzymano wiadomość.
  • Udane jest zapisanie tego typu danych jako nil .

Aby debugować, dlaczego twój typ danych jest zapisywany jako nil, możesz użyć funkcji JSONEncode. Gdy przekażesz swoje dane typu Lua w tę funkcję, otrzymasz je w formie, jaką Roblox miałby zapisane z dostawcami danych, co umożliwia zapowiedź i zbadanie zwróconych danych.