Memoria store mappa ordinata

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

La struttura dei dati della mappa ordinata sortita di magazzini di memoria ti consente di archiviare dati frequenti in memoria come coppie chiave-valore con una chiave di ordinamento opzionale e mantenere un ordine specifico in base alle chiavi e alle chiavi.A differenza delle code, l'ordine delle chiavi che entrano in una mappa non determina l'ordine di esecuzione, rendendo le mappe ordinate utili per ordinare i dati organizzati per la realizzazione di entità di coinvolgimento come classifiche e aste cross-server.

Limitazioni

Oltre ai limiti della dimensione della struttura dei dati , le mappe ordinate hanno un limite di dimensione della chiave di 128 caratteri, un limite di dimensione del valore di 32 KB e un limite di dimensione della chiave di ordinamento di 128 caratteri.

Se devi archiviare dati che superano questo limite per la tua esperienza, puoi adottare la tecnica di sharding per dividerli e distribuirli attraverso prefisso chiave in più strutture di dati.Anche i depositi di memoria frammentati possono aiutare a migliorare la scalabilità del tuo sistema.

Ottieni una mappa ordinata

Per ottenere una mappa ordinata, chiama MemoryStoreService:GetSortedMap() con un nome che vuoi definire per la mappa.Il nome è globale all'interno dell'esperienza, quindi puoi accedere alla stessa mappa ordinata su qualsiasi script utilizzando il nome.

Ottenere una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")

Dopo aver ottenuto una mappa ordinata, chiama una qualsiasi delle seguenti funzioni per leggere o scrivere dati in essa:

FunzioneAzione
MemoryStoreSortedMap:SetAsync()Aggiungi una nuova chiave o sostituisci il valore e/o la chiave di ordinamento se la chiave esiste già.
MemoryStoreSortedMap:GetAsync()Leggi una chiave particolare.
MemoryStoreSortedMap:GetRangeAsync()Leggi tutte le chiavi esistenti o una specifica gamma di esse.
MemoryStoreSortedMap:UpdateAsync()Aggiorna il valore di una chiave e/o la chiave di ordinamento dopo averla recuperata da una mappa ordinata.
MemoryStoreSortedMap:RemoveAsync()Rimuovi una chiave dalla mappa ordinata.

Aggiungi o sovrascrivi i dati

Per aggiungere una nuova chiave o sovrascrivere il valore o il tipo di chiave di una chiave nella mappa ordinata, chiama MemoryStoreSortedMap:SetAsync() con la chiave nome , il suo valore , un tempo di scadenza in secondi e una chiave di sorta opzionale .La memoria si pulisce automaticamente una volta che la chiave scade.Il tempo massimo di scadenza è 3,888,000 secondi (45 giorni).La chiave di ordinamento, se fornita, deve essere un numero valido (intero o punto fluttuante) o una Stringa.

Nell'ordine di selezione delle tue chiavi, una chiave di selezione ha precedenza su una chiave.Ad esempio, quando si ordina in ordine crescente, le chiavi di ordinamento numeriche si ordinano prima, seguite da chiavi di ordinamento delle stringhe, seguite da oggetti senza chiave di ordinamento.Tutti gli elementi con chiavi di ordinamento numeriche vengono ordinati per chiave di ordinamento, se la chiave di ordinamento per due elementi è uguale, vengono ordinati per chiave.Allo stesso modo, tutti gli elementi con chiavi di ordinamento delle stringhe sono ordinati per chiave di ordinamento, se la chiave di ordinamento per due elementi è uguale, vengono ordinati per chiave.Tutti gli elementi senza chiave di tipo vengono ordinati solo dalla chiave.

Esempio di alcuni dati ordinati in ordine crescente -


{Key: "player1", Value: someValue1, SortKey: -1}
{Key: "player2", Value: someValue2, SortKey: 0}
{Key: "player4", Value: someValue3, SortKey: 1}
{Key: "player5", Value: someValue4, SortKey: 1}
{Key: "player3", Value: someValue5, SortKey: 3.14}
{Key: "player6", Value: someValue6, SortKey: "someString"}
{Key: "player0", Value: someValue7}
{Key: "player7", Value: someValue8}

Nota come player0 ordina dopo tutte le chiavi con una chiave di ordinamento.player6 ordina dopo tutte le chiavi con una chiave di ordinamento numerica.player4 e player5 hanno la stessa chiave di tipo, quindi vengono ordinati in ordine crescente per chiave.

Aggiungere dati a una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end

Ottieni dati

Puoi ottenere un valore di dati e ordinare la chiave associata a una chiave specifica o ottenere più valori e ordinare le chiavi per le chiavi all'interno di un intervallo.

Ottieni dati con una chiave

Per ottenere un valore e una chiave di ordinamento associati a una chiave dalla mappa ordinata, chiama MemoryStoreSortedMap:GetAsync() con il nome chiave .

Ottenere una chiave particolare da una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = sortedMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end

Ottieni dati con più chiavi

Per ottenere i dati per più chiavi dalla mappa ordinata come un'unica operazione, chiama MemoryStoreSortedMap:GetRangeAsync().Questa funzione elenca tutte le chiavi esistenti per impostazione predefinita, ma puoi impostare l'intervallo superiore e inferiore per la gamma di chiavi.Ad esempio, il seguente esempio di codice recupera fino a 20 elementi a partire dall'inizio della mappa ordinata, con chiavi maggiori o uguali a 10 , chiavi di ordinamento maggiori o uguali a 100 e chiavi inferiori o uguali a 50 , chiavi di ordinamento inferiori o uguali a 500 .

Ottenere un intervallo di chiavi da una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local lowerBound = {}
lowerBound["key"] = "10"
lowerBound["sortKey"] = 100
local upperBound = {}
upperBound["key"] = "50"
upperBound["sortKey"] = 500
-- Ottieni fino a 20 oggetti a partire dall'inizio
local getSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(
Enum.SortDirection.Ascending, 20, lowerBound, upperBound)
end)
if getSuccess then
for _, item in items do
print(item.key)
print(item.sortKey)
end
end

Aggiorna dati

Per recuperare il valore e il tasto di ordinamento di una chiave da una mappa ordinata e aggiornarla, chiama con il nome della chiave , una funzione di richiamo per aggiornare il valore e il tasto di ordinamento per questa chiave e un tempo di scadenza in secondi.Il tempo massimo di scadenza è 3,888,000 secondi (45 giorni).

Per la maggior parte delle esperienze, più server possono aggiornare la stessa chiave contemporaneamente e cambiare il valore.Poiché UpdateAsync() modifica sempre l'ultimo valore prima di aggiornare, dovresti usarlo per leggere l'ultimo valore come input per la tua funzione di richiamo.

Ad esempio, il seguente esempio di codice aggiorna il punteggio in una classifica per un giocatore in una Gioco.Il punteggio viene calcolato come uccisioni / decessi.UpdateAsync() garantisce che le uccisioni e le morti vengono aggiornate per i valori più recenti anche se più server di gioco aggiornano lo stesso oggetto contemporaneamente.Le uccisioni e le morti di un Giocatoreaumentano monotonamente e possono quindi aumentare solo di valore in una Sessione.

Aggiornamento del punteggio della classifica per un giocatore in una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("Leaderboard")
local function updateLeaderboard(itemKey, killsToAdd, deathsToAdd)
local success, newStats, newScore = pcall(function()
return sortedMap:UpdateAsync(itemKey, function(playerStats, playerScore)
playerStats = playerStats or { kills = 0, deaths = 0 }
playerStats.kills += killsToAdd
playerStats.deaths += deathsToAdd
if playerStats then
-- `playerScore` è la chiave di ordinamento utilizzata per ordinare gli elementi nella mappa
playerScore = playerStats.kills / math.max(playerStats.deaths, 1)
return playerStats, playerScore
end
return nil
end, 30)
end)
if success then
print(newStats)
print(newScore)
end
end

Il ritardo per UpdateAsync() è simile a GetAsync() e SetAsync() a meno che non ci sia una concorrenza.

Quando si verifica una concorrenza, il sistema riprova automaticamente l'operazione fino a quando uno di questi tre eventi non accade: l'operazione ha successo, la funzione di richiamo restituisce nil , o si raggiunge il numero massimo di riprobi.Se il sistema raggiunge il numero massimo di riprobi, restituisce un conflitto.

Rimuovi i dati

Puoi usare MemoryStoreSortedMap:RemoveAsync() per entrambi rimuovere una chiave dalla mappa ordinata e eliminare tutti i dati in una mappa memorizzata ordinata.

Rimuovi una chiave

Per rimuovere una chiave dalla mappa ordinata, chiama MemoryStoreSortedMap:RemoveAsync() con un nome chiave name .

Rimuovi una chiave da una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, "someStringSortKey")
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end

Elimina tutti i dati

Per eliminare la memoria nelle mappe ordinate, elenca tutte le tue chiavi con MemoryStoreSortedMap:GetRangeAsync() , quindi rimuovile con MemoryStoreSortedMap:RemoveAsync() .

Elimina memoria in una mappa ordinata

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Limite inferiore iniziale di nil inizia a scorrere dall'Articoloprimo
local exclusiveLowerBound = nil
while true do
-- Ottieni fino a cento elementi a partire dal limite inferiore attuale
local getRangeSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(Enum.SortDirection.Ascending, 100, exclusiveLowerBound)
end)
if getRangeSuccess then
local removeSuccess = true
local removeError = nil
for _, item in items do
removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync(item.key)
end)
end
-- Se c'era un errore nell'eliminazione degli elementi, riprova con lo stesso limite inferiore esclusivo
if not removeSuccess then
warn(removeError)
-- Se la portata è inferiore a cento elementi, viene raggiunto il limite della mappa
elseif #items < 100 then
break
else
-- L'ultima chiave recuperata è il limite inferiore esclusivo per la prossima iterazione
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end