Mappe di hash , simili alle mappe sortite, ti consente di memorizzare in memoria i valori chiave come coppi. A differenza delle mappe sortite, non garantiscono alcuna garanzia di ordinamento. Questa struttura di dati è utile per casi che richiedono una semplice memorizzazione dei dati e un Accessorapido, come le condivisioni delle risorse, le case d'asta fisiche e altro ancora. Le
Limitazioni
Le mappe hash hanno un limite di dimensione della chiave di 128 caratteri e un limite di dimensione del valore di 32 KB.
Altrimenti, le mappe di hash utilizzano gli stessi richieste API e quota di memoria limiti come le altre strutture di dati di memoria.
Ottenere una mappa hash
Per ottenere una mappa di hash, chiama Class.MemoryStoreService:Get:`Class.MemoryStoreService:Get:` con un nome per la mappa di hash. Il nome è globale all'interno dell'esperienza, quindi puoi accedere alla stessa mappa di hash su qualsiasi script che usa questo nome.
Ottenere una mappa hash
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
Dopo aver ottenuto una mappa di hashes, chiama una delle seguenti funzioni per leggere o scrivere dati in essa:
Funzione | Azione |
---|---|
MemoryStoreHashMap:SetAsync() | Aggiungi una nuova chiave o sovrascrivere il valore se la chiave esiste già. |
MemoryStoreHashMap:GetAsync() | Leggi una chiave in particolare. |
MemoryStoreHashMap:ListItemsAsync() | Elenca oggetti in una mappa hash. |
MemoryStoreHashMap:UpdateAsync() | Aggiorna il valore di una chiave dopo averla recuperata da una mappa di hashes. |
MemoryStoreHashMap:RemoveAsync() | Rimuovi una chiave dalla mappa di hash. |
Aggiungere o sovrascrivere dati
Per aggiungere una nuova chiave o sovrascrivere il valore di una chiave nella mappa di hashing, chiama MemoryStoreHashMap:SetAsync() con il suo nome , il suo valore e un 1> tempo di scadenza1> in secondi. Il memory automaticamente si limpia una volta che la chiave esce. Il tempo massimo di scadenza è 3,88
Aggiungere dati a una mappa hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
Ottenere dati
Puoi ottenere un valore associato a una chiave specifica o ottenere più coppie di valore chiave nella mappa hash.
Ottenere i dati con una chiave
Per ottenere un valore associato a una chiave dalla mappa hash, chiama MemoryStoreHashMap:GetAsync() con la chiave nome .
Ottenere una chiave in particolare da una mappa hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = hashMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
Ottenere dati con più paesi chiave-valore
Per ottenere tutti i paesi chiave dalla mappa hash come singola operazione, chiama MemoryStoreHashMap:ListItemsAsync() con la dimensione della pagina desiderata. Questa funzione elenca tutti i key esistenti in modo pagato. Ad esempio, il seguente esempio di codice recupera fino a 32 elementi dalla mappa hash.
Elencare gli elementi in una mappa Hashes
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Ottieni la lista di oggetti, 32 oggetti alla volta
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Ottieni la pagina attuale
local entries = pages:GetCurrentPage()
-- iterate attraverso tutti i paesi chiave-valore sulla pagina
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Controlla se la ultima pagina è stata raggiunta
if pages.IsFinished then
break
else
print("------")
-- Passa alla prossima pagina
pages:AdvanceToNextPageAsync()
end
end
end
Aggiornamento dei dati
Per recuperare il valore di una chiave da una mappa di hashes e aggiornarlo, chiama MemoryStoreHashMap:UpdateAsync() con il nome della chiave, una funzione callback per aggiornare la chiave e un tempo di scadenza in secondi.
Per la maggior parte delle esperienze, più server possono aggiornare la stessa chiave contemporaneamente e cambiare il valore. Come UpdateAsync() sempre modifica il valore più recente prima di aggiornare, dovresti usarlo per leggere il valore più recente come input per la tua funzione di richiamata.
Ad esempio, il seguente codice di esempio aggiorna il numero di risorse di una risorsa in un Inventario, reportoriocondiviso. UpdateAsync() garantisce che tutte le contribuzioni dei giocatori saranno in questo Inventario, reportoriocondiviso, anche se queste contribuzioni vengono fatte contemporaneamente. In questa funzione, garantisce anche un massimo di 500 contribuzioni.
Aggiornamento del numero di risorse per una risorsa in un inventario condiviso
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("ResourceInventory")
local function contributeResources(itemResource, addedCount)
local success, newResourceCount = pcall(function()
return hashMap:UpdateAsync(itemResource, function(resource)
resource = resource or {count = 0}
resource.count = resource.count + addedCount
-- assicuriamoci di non superare il numero massimo di risorse
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
end
end
Il lag per UpdateAsync() è simile a GetAsync() e SetAsync() a meno che non ci sia alcuna eccezione.
Quando si verifica la limitazione, il sistema riprova automaticamente l'operazione fino a quando una di queste tre cose non accade: l'operazione ha successo, il callback funziona nulla o il numero massimo di riprove è raggiunto. Se il sistema raggiunge il numero massimo di riprove, restituisce un conflitto.
Rimozione dei dati
Puoi usare MemoryStoreHashMap:RemoveAsync() per entrambi la rimozione di una chiave dalla mappa di hash e la cancellazione di tutti i dati in una mappa di hash della memoria.
Rimuovere una chiave
Per rimuovere una chiave dalla mappa di hash, chiama MemoryStoreHashMap:RemoveAsync() con un nome chiave.
Rimuovi una chiave da una mappa hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
Eliminazione di tutte le informazioni
Per eliminare tutti i dati in una mappa di hash, elenca tutti i tuoi oggetti con MemoryStoreHashMap:ListItemsAsync() , quindi rimuovili con MemoryStoreHashMap:RemoveAsync() .
Elimina tutti i dati in una mappa Hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Ottieni la lista di oggetti, 32 oggetti alla volta
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Ottieni la pagina attuale
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- iterate attraverso tutti i paesi chiave-valore sulla pagina
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync(entry.key)
end)
if not removeSuccess then
warn(removeError)
end
end
-- Controlla se la ultima pagina è stata raggiunta
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("------")
-- Passa alla prossima pagina
pages:AdvanceToNextPageAsync()
end
end
end