Mapas de hash , similar a los mapas ordenados, le permite almacenar datos en el memoria como pares de valores de clave. En lugar de los mapas ordenados, mantienen garantías de orden sin clasificación. Esta estructura de datos es útil para casos que requieren un simple almacenamiento de datos y un acceso rápido, como compartidos inventarios, casas de subasta físicas y más. Mapas de hash manejan
Límites
Las tablas de hash tienen un límite de tamaño de la llave de 128 caracteres y un límite de tamaño de valor de 32 KB.
De lo contrario, las tablas de hash usan los mismos API request y Memory quota límites que las demás estructuras de datos de memoria.
Obteniendo un Mapa de Hash
Para obtener un mapa de hash, llama a Class.MemoryStoreService:Get:`Class.MemoryStoreService:Get:` con un nombre para el mapa de hash. El nombre es global dentro de la experiencia, por lo que puedes acceder al mismo mapa de hash en cualquier script que use este nombre.
Obteniendo un Mapa de Hash
local MemoryStoreService = game:GetService("MemoryStoreService")local hashMap = MemoryStoreService:GetHashMap("HashMap1")
Después de obtener un mapa de hash, llame a cualquiera de las siguientes funciones para leer o escribir datos en él:
Función | Acción |
---|---|
MemoryStoreHashMap:SetAsync() | Añadir una nueva llave o sobrescribir el valor si la llave ya existe. |
MemoryStoreHashMap:GetAsync() | Leer una claveen particular. |
MemoryStoreHashMap:ListItemsAsync() | Lista ítems en un mapa de hashes. |
MemoryStoreHashMap:UpdateAsync() | Actualizar el valor de una llave después de recuperarla de un mapa de hashes. |
MemoryStoreHashMap:RemoveAsync() | Elimina una clave del mapa de hash. |
Añadir o sobrescribir datos
Para agregar una nueva llave o sobrescribir el valor de una llave en el mapa de claves, llama a MemoryStoreHashMap:SetAsync() con el nombre de la llave, su valor y un tiempo de caducidad en segundos. El almacenamiento de memoria se limpia automáticamente una vez que la llave expira. El tiempo máximo de caducidad es 3,888,000 segundos (4
Añadiendo datos a un mapa de 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
Obteniendo datos
Puede obtener un valor asociado con una llave específica o obtener múltiples pares de valor de llave en el mapa de hash.
Obtener datos con una clave
Para obtener un valor asociado con una llave de la lista de valores, llama a MemoryStoreHashMap:GetAsync() con la llave nombre .
Obtener una Clave Específica de un Mapa deHash
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
Obtener datos con múltiples pares de clave-valor
Para obtener todos los pares de valores de clave del mapa de hash como operación única, llama a MemoryStoreHashMap:ListItemsAsync() con el tamaño de página deseado. Esta función lista todos los valores existentes de forma página. Por ejemplo, el siguiente código de ejemplo recupera hasta 32 elementos del mapa de hash.
Listar elementos en un Mapa de Hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Obtener lista de artículos, 32 artículos a la vez
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Obtener la página actual
local entries = pages:GetCurrentPage()
-- iterar a través de todos los pares de valores de la página
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Asegurarse de que la última página haya sido alcanzada
if pages.IsFinished then
break
else
print("------")
-- Avanzar a la página siguiente
pages:AdvanceToNextPageAsync()
end
end
end
Actualizar datos
Para recuperar el valor de una llave de un mapa de hash y actualizarlo, llama a Class.MemoryStore:`UpdateAsync() ` con el nombre de la clave, una función de llamada para actualizar la llave y un tiempo de caducidad en segundos.
Para la mayoría de las experiencias, varios servidores pueden actualizar la misma clave simultáneamente y cambiar el valor. Como Class.MemoryStore:` actualiza el último valor antes de actualizar, deberías usarlo para leer el último valor como entrada para tu función de llamada.
Por ejemplo, el siguiente código de ejemplo actualiza el recuento de recursos de un recurso en un inventario compartido. UpdateAsync() garantiza que todas las contribuciones de los jugadores se dirijan a este inventario compartido, incluso si estas contribuciones se hacen simultáneamente. En esta función, también se aplica un límite de máximo de 500.
Actualizar el recuento de recursos para un recurso en un inventario compartido
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
-- asegúrese de que no excedamos el máximo de contenedores de recursos
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
end
end
La latencia para UpdateAsync() es similar a Class.MemoryStore() y Class.MemoryStore() a menos que haya contención.
Cuando ocurre la contención, el sistema intenta automáticamente la operación hasta que uno de estos tres suceda: la operación tiene éxito, la función de llamada devuelve nil o el máximo de intentos se alcanza. Si el sistema alcanza el máximo de intentos, se devuelve un error.
Eliminando datos
Puede usar MemoryStoreHashMap:RemoveAsync() para ambas cosas, eliminar una clave de la lista de claves y eliminar todos los datos en un mapa de memoria.
Eliminando una Clave
Para eliminar una clave del mapa de hash, llama a MemoryStoreHashMap:RemoveAsync() con una clave nombre .
Elimina una Clave de un Mapa de 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
Eliminando todos los datos
Para eliminar todos los datos en un mapa de hash, lista todos tus artículos con MemoryStoreHashMap:ListItemsAsync() , luego elimínalos con MemoryStoreHashMap:RemoveAsync() .
Elimina todos los datos en un Mapa de hash
local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Obtener lista de artículos, 32 artículos a la vez
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Obtener la página actual
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- iterar a través de todos los pares de valores de la página
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
-- Asegurarse de que la última página haya sido alcanzada
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("------")
-- Avanzar a la página siguiente
pages:AdvanceToNextPageAsync()
end
end
end