La estructura de datos de ordenar mapa de almacenamiento de memoria le permite almacenar datos de frecuencia en memoria como pares de clave con una llave de orden opcional y mantener un orden específico según las llaves y las claves. A diferencia de las colas, la orden de las llaves que ingresan a un mapa no determina la orden de procesamiento, lo que hace que los mapas ordenados sean ú
Límites
Además de los límites de tamaño de la estructura de datos, los mapas clasificados tienen un límite de tamaño de la llave de 128 caracteres, un límite de tamaño de valor de 32 KB y un límite de tamaño de la clave de 128 caracteres.
Si necesita almacenar datos que exceden 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 a varias estructuras de datos. Las tiendas de memoria también pueden ayudar a mejorar la escalabilidad de su sistema.
Obteniendo un Mapa Ordenado
Para obtener un mapa ordenado, llama a MemoryStoreService:GetSortedMap() con un nombre que quieres definir para el mapa. El nombre es global dentro de la experiencia, por lo que puedes acceder al mismo mapa ordenado en cualquier script que usa el nombre.
Obteniendo 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ón | Acción |
---|---|
MemoryStoreSortedMap:SetAsync() | Añadir una nueva llave o sobrescribir el valor y/o ordenar la llave si la llave ya existe. |
MemoryStoreSortedMap:GetAsync() | Leer una claveen particular. |
MemoryStoreSortedMap:GetRangeAsync() | Leer todas las llaves existentes o un rango específico de ellas. |
MemoryStoreSortedMap:UpdateAsync() | Actualizar el valor de una llave y/o clave de clasificación después de recuperarla de un mapa ordenado. |
MemoryStoreSortedMap:RemoveAsync() | Elimina una clave del mapa ordenado. |
Añadir o sobrescribir datos
Para agregar una nueva llave o sobrescribir el valor o la clave de clasificación de una llave en el mapa ordenado, llama a MemoryStoreSortedMap:SetAsync() con el nombre de la llave , su valor , un tiempo de
En el orden de clasificación de tus claves, una clave de clasificación toma la precedencia sobre una clave. Por ejemplo, cuando clasificas en orden ascendente, las claves de clasificación numéricas se sortean primero, seguidas por claves de clasificación de cuerda, seguidas por elementos sin clave. Todas las claves de clasificación numéricas se sortean por clave, si la clave para dos elementos es
Ejemplo de algunos datos clasificados por 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}
Nota cómo player0 clasifica después de todas las llaves con una llave de clave. player6 clasifica después de todas las llaves con una clavede clasificación numérica. player4 y 1> player51> tienen la misma llave de clave, por lo que están clasificados en orden ascendente por clave.
Añadir 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
Obteniendo datos
Puede obtener un valor de datos y ordenar la clave asociada con una clave específica o obtener múltiples valores y ordenar las claves dentro de un rango.
Obtener datos con una clave
Para obtener un valor y ordenar la clave asociada con una clave del mapa clasificado, llame a MemoryStoreSortedMap:GetAsync() con la clave nombre .
Obtener una Clave Específica 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 llaves
Para obtener datos para múltiples claves del mapa clasificado como una sola operación, llame a Class.MemoryStoreSortedMap:GetRangeAsync() ". Esta función lista todos los valores existentes por defecto, pero puede estable
Obtener un Rango de Teclas 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 desde el 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 llave de un mapa ordenado y actualizarla, llama a MemoryStoreSortedMap:UpdateAsync() con la llave nombre , una función de llamada para actualizar el valor y la clave para esta llave, y un tiempo de expiración en segundos. El tiempo de expiración máximo es 3,888,000 segundos (45 d
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 valor más reciente antes de actualizar, deberías usarlo para leer el valor más reciente como entrada para tu función de llamada.
Por ejemplo, el siguiente código de ejemplo 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() garantiza que las muertes y las muertes se actualizan para los valores más recientes incluso si varios servidores de juegos actualizan el mismo artículo simultáneamente. Un jugador's
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 llave de clasificación que se usa para clasificar 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 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 MemoryStoreSortedMap:RemoveAsync() para ambas cosas, tanto para eliminar una clave del mapa ordenado como para eliminar todos los datos en un almacén de memoria ordenado.
Eliminando una Clave
Para eliminar una llave del mapa clasificado, llama a MemoryStoreSortedMap:RemoveAsync() con una llave nombre .
Elimina 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
Eliminando todos los datos
Para eliminar la memoria en los mapas clasificados, lista todas tus llaves 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")
-- La parte inferior inicial de nulo comienza a fluir desde el primer objeto
local exclusiveLowerBound = nil
while true do
-- Obtén hasta cien artículos desde el 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 los 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 ítems, se alcanza el final del mapa
elseif #items < 100 then
break
else
-- La última llave recuperada es el límite inferior exclusivo para la próxima iteración
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end