Mapa ordenado almacenado en memoria

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

La estructura de datos del mapa ordenado de almacenes de memoria te permite almacenar datos frecuentes en memoria como pares clave-valor con una clave de clasificación opcional y mantener un orden específico basado en las claves de clasificación y las claves.A diferencia de las colas, el orden de las claves que ingresan a un mapa no determina el orden de procesamiento, lo que hace que los mapas ordenados sean útiles para organizar la organización de datos basada en clasificación para implementar entidades en experiencia para el compromiso, como tablas de clasificación y subastas de servidores cruzados.

Límites

Además de los límites de tamaño de la estructura de datos , las mapas ordenados tienen un límite de tamaño de clave de 128 caracteres, un límite de tamaño de valor de 32 KB y un límite de tamaño de clave de clasificación de 128 caracteres.

Si necesita almacenar datos que superen este límite para su experiencia, puede adoptar la técnica de fragmentación para dividirlos y distribuirlos a través de prefijo de clave en múltiples estructuras de datos.Las tiendas de memoria de fragmentación también pueden ayudar a mejorar la escalabilidad de su sistema.

Obtener un mapa ordenado

Para obtener un mapa ordenado, llame a con un nombre que quieras definir para el mapa.El nombre es global dentro de la experiencia, por lo que puedes acceder al mismo mapa ordenado en cualquier script usando el nombre.

Obtener un mapa ordenado

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

Después de obtener un mapa ordenado, llame a cualquiera de las siguientes funciones para leer o escribir datos en él:

FunciónAcción
MemoryStoreSortedMap:SetAsync()Añadir una nueva clave o reemplazar el valor y/o la clave de clasificación si la clave ya existe.
MemoryStoreSortedMap:GetAsync()Leer una clave particular.
MemoryStoreSortedMap:GetRangeAsync()Lee todas las claves existentes o un rango específico de ellas.
MemoryStoreSortedMap:UpdateAsync()Actualizar el valor de una clave y/o clave de clasificación después de recuperarla de un mapa ordenado.
MemoryStoreSortedMap:RemoveAsync()Eliminar una clave del mapa ordenado.

Añadir o reemplazar datos

Para agregar una nueva clave o reemplazar el valor o la clave de clasificación de una clave en el mapa ordenado, llame a MemoryStoreSortedMap:SetAsync() con la clave nombre , su valor , un tiempo de expiración en segundos y una clave opcional de clasificación .La memoria se limpia automáticamente una vez que expira la clave.El tiempo de expiración máximo es de 3,888,000 segundos (45 días).La clave de orden, si se proporciona, debe ser un número válido (integro o punto flotante) o una cadena.

En el orden de clasificación de tus teclas, una tecla de clasificación tiene prioridad sobre una tecla.Por ejemplo, al ordenar en orden ascendente, las claves de clasificación numéricas se ordenan primero, seguidas de las claves de clasificación de texto, y luego de los elementos sin clave de clasificación.Todos los elementos con claves de clasificación numéricas se ordenan por clave de clasificación, si la clave de clasificación para dos elementos es igual, se ordenan por clave.Del mismo modo, todos los elementos con claves de clasificación por cadena se ordenan por clave de clasificación, si la clave de clasificación para dos elementos es igual, se ordenan por clave.Todos los elementos sin clave de clasificación se ordenan solo por la clave.

Ejemplo de algunos datos ordenados en orden ascendente -


{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}

Observe cómo player0 ordena después de todas las claves con una clave de orden.player6 clasifica después de todas las claves con una clave de clasificación numérica. player4 y player5 tienen la misma clave de orden, por lo que se ordenan en orden ascendente por clave.

Agregar datos a un mapa ordenado

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

Obtener datos

Puede obtener un valor de datos y una clave de clasificación asociada con una clave específica o obtener múltiples valores y claves de clasificación para claves dentro de un rango.

Obtener datos con una clave

Para obtener un valor y una clave de clasificación asociada con una clave del mapa ordenado, llame a MemoryStoreSortedMap:GetAsync() con la clave nombre .

Obtener una clave particular de un mapa ordenado

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

Obtener datos con múltiples claves

Para obtener datos para múltiples claves desde el mapa ordenado como una sola operación, llame a MemoryStoreSortedMap:GetRangeAsync() .Esta función lista todas las claves existentes por defecto, pero puedes establecer los límites superiores e inferiores para el rango de claves.Por ejemplo, el siguiente ejemplo de código recupera hasta 20 elementos a partir del comienzo del mapa ordenado, con claves mayores que o iguales a 10 , claves de clasificación mayores que o iguales a 100 y claves menos que o iguales a 50 , claves de clasificación menos que o iguales a 500 .

Obtener un rango de claves de un mapa ordenado

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
-- Obtén hasta 20 artículos a partir del principio
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

Actualizar datos

Para recuperar el valor y la clave de una clave de un mapa ordenado y actualizarla, llame a con la clave nombre , una función de llamada de devolución para actualizar el valor y la clave de esta clave, y un tiempo de expiración de segundos en segundos.El tiempo de expiración máximo es de 3,888,000 segundos (45 días).

Para la mayoría de las experiencias, varios servidores pueden actualizar la misma clave simultáneamente y cambiar el valor.Como UpdateAsync() siempre modifica el último valor antes de actualizar, debe usarlo para leer el último valor como la entrada para su función de llamada de devolución.

Por ejemplo, el siguiente ejemplo de código actualiza la puntuación en una tabla de clasificación para un jugador en un juego.La puntuación se calcula como muertes / muertes.UpdateAsync() asegura que las muertes y muertes se actualizan para los valores más recientes incluso si varios servidores de juegos actualizan el mismo artículo simultáneamente.Las muertes y asesinatos de un jugador aumentan de forma monótona y, por lo tanto, solo pueden aumentar de valor en una sesión.

Actualizar la puntuación de la tabla de clasificación para un jugador en un mapa ordenado

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` es la clave de clasificación que se utiliza para ordenar los elementos en el mapa
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

La latencia para UpdateAsync() es similar a GetAsync() y SetAsync() a menos que haya competencia.

Cuando ocurre la competencia, el sistema vuelve a intentar la operación automáticamente hasta que ocurra una de estas tres cosas: la operación tiene éxito, la función de llamada de devolución devuelve nil , o se alcanza el número máximo de intentos.Si el sistema llega al número máximo de intentos, devuelve un conflicto.

Eliminar datos

Puedes usar MemoryStoreSortedMap:RemoveAsync() para eliminar una clave del mapa ordenado y eliminar todos los datos en un mapa almacenado en memoria ordenado.

Eliminar una clave

Para eliminar una clave del mapa ordenado, llama con un nombre de clave .

Eliminar una clave de un mapa ordenado

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

Eliminar todos los datos

Para eliminar la memoria en mapas ordenados, lista todas tus claves con MemoryStoreSortedMap:GetRangeAsync() , luego elimínalas con MemoryStoreSortedMap:RemoveAsync() .

Eliminar memoria en un mapa ordenado

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Límite inferior inicial de nil comienza a flujo desde el primer objeto
local exclusiveLowerBound = nil
while true do
-- Obtenga hasta cien elementos a partir del límite inferior actual
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
-- Si hubo un error al eliminar elementos, inténtalo de nuevo con el mismo límite inferior exclusivo
if not removeSuccess then
warn(removeError)
-- Si el rango es menor a cien elementos, se alcanza el final del mapa
elseif #items < 100 then
break
else
-- La última clave recuperada es el límite inferior exclusivo para la siguiente iteración
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end