Mapa Almacenado de 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 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ónAcció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