Hafıza deposu sıralanmış haritayı

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

sıralanmış harita hafıza depolarının veri yapısı, sıralama anahtarı ve anahtarlarla sıklıkla hafızada bulunan verileri anahtar-değer çiftleri olarak depolamanıza ve sıralama anahtarları ve anahtarlara dayalı belirli bir düzen korumanıza izin verir.Sıraların aksine, bir haritaya giren anahtarların sırası işleme düzenini belirlemez, sayısal haritaları sıralamak için kullanılabilir hale getirir ve lider tabloları ve cross-server açık artırmalar gibi etkileşimli deneyim entiteleri için uygulama için kullanılabilir hale getirir.

Sınırlar

Veri yapısı boyut sınırlarına ek olarak, sıralanmış haritaların bir anahtar boyut sınırı 128 karakter, bir değer boyut sınırı 32 KB ve bir sıralama anahtar boyut sınırı 128 karakterdir.

Deneyiminiz için bu sınırı aşan verileri depolamak gerekiyorsa, parçalama tekniğini benimseyerek bunları anahtar ön ekleri aracılığıyla çoklu veri yapılarına bölüp dağıtabilirsiniz.Parçalanmış bellek depoları, sisteminizin ölçeklenebilirliğini artırmaya da yardımcı olabilir.

Sıralanmış bir harita alın

Sıralanmış bir harita almak için, haritaya tanımlanmak istediğiniz bir MemoryStoreService:GetSortedMap() ile ara çağırın.Adı deneyim içinde küreseldir, bu nedenle adı kullanarak herhangi bir senaryoda aynı sıralı haritaya erişebilirsiniz.

Sıralı Bir Harita Almak

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

Sıralı bir haritaya sahip olduktan sonra, içinde veri okumak veya yazmak için aşağıdaki işlevlerden herhangi birini çağırın:

FonksiyonEylem
MemoryStoreSortedMap:SetAsync()Yeni bir anahtar ekleyin veya değeri ve/veya sıralama anahtarını yeniden yazın, eğer anahtar zaten varsa.
MemoryStoreSortedMap:GetAsync()Oku belirli bir anahtar.
MemoryStoreSortedMap:GetRangeAsync()Oku mevcut tüm anahtarları veya belirli bir menzili oku.
MemoryStoreSortedMap:UpdateAsync()Güncelle düzenli bir haritadan alındıktan sonra bir anahtarın ve/veya sıralama anahtarının değerini güncelleyin.
MemoryStoreSortedMap:RemoveAsync()Çıkar sıralanmış haritadan bir anahtarı kaldır.

Verileri ekle veya üzerine yazın

Yeni bir anahtar eklemek veya sıralanmış haritadaki bir anahtarın değerini veya sıralama anahtarını yeniden yazmak için, MemoryStoreSortedMap:SetAsync() anahtarı ile adı , onun değeri , bir son kullanma süresi ve bir seçici sıralama anahtarı ile çağırın.Hafıza, anahtar sona erdiğinde otomatik olarak temizlenir.Maksimum son kullanma süresi 3,888,000 saniye (45 gün) dir.Eğer sağlanırsa, sıralama anahtarı geçerli bir sayı (küçük sayı veya küçük nokta) veya bir diziolmalıdır.

Anahtarların sıralama düzeninde, bir sıralama anahtarı bir anahtarın önüne geçer.Örneğin, artan sıralamada, sayısal sıralama anahtarları ilk sırada sıralanır, ardından dize sıralama anahtarları ve ardından sıralama anahtarı olmayan öğeler sıralanır.Sayısal sıralama anahtarlarına sahip tüm öğeler, iki öğe için sıralama anahtarı eşitse, anahtarlara göre sıralanır.Benzer şekilde, dize sıralama anahtarlarına sahip tüm öğeler sıralama anahtarına göre sıralanır, eğer iki öğenin sıralama anahtarı eşitse, anahtarlara göre sıralanırlar.Sıralama anahtarı olmayan tüm öğeler sadece anahtar ile sıralanır.

Artan sıralamada sıralanan bazı verilerin örneği -


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

Bir sıralama anahtarı ile tüm anahtarlara nasıl sıralandığını not edin player0 .player6 tüm sayısal sıralama anahtarlarından sonra sıralanır.player4 ve player5 aynı tür anahtarına sahiptir, bu nedenle anahtar tarafından artış sırasında sıralanırlar.

Sıralanmış Haritaya Veri Ekleme

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

Veri alın

Belirli bir anahtar ile ilişkili bir veri değeri alabilir veya bir menzil içindeki anahtarlar için çok sayıda değer ve sıralama anahtarı alabilirsiniz.

Tek bir anahtarla veri alın

Sıralanmış haritadan bir anahtar ile ilişkili bir değer ve sıralama anahtarı almak için, anahtar ile MemoryStoreSortedMap:GetAsync() adı çağırın.

Sıralanmış Haritadan Özel Bir Anahtar Almak

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

Çoklu anahtarlarla veri alın

Sıralanmış haritadan çoklu anahtar için veri almak için tek bir işlem olarak, MemoryStoreSortedMap:GetRangeAsync() 'yi arayın.Bu işlev varsayılan olarak mevcut tüm anahtarları listeler, ancak anahtar aralığı için üst ve alt sınırları ayarlayabilirsiniz.Örneğin, aşağıdaki kod örneği, 20 öğeye kadar çıkarır, sıralanmış haritanın başlangıcından itibaren, anahtarlar , sıralama anahtarları ve anahtarlar , sıralama anahtarlarından daha az veya eşit , sıralama anahtarlarından daha az veya eşit .

Sıralanmış Bir Haritadan Bir Dizi Anahtar Alma

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
-- Başlangıçtan itibaren en fazla 20 öğe alın
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

Verileri güncelle

Bir anahtarın değerini ve sıralanmış bir haritadan sıralanmış anahtarın anahtarını geri almak ve güncellemek için, MemoryStoreSortedMap:UpdateAsync() anahtarı ile adı anahtarı ile bir geri çağrı fonksiyonu değeri ve bu anahtar için bir son kullanma süresi saniye güncellemek için, çağırın.Maksimum son kullanma süresi 3,888,000 saniye (45 gün) dir.

Çoğu deneyim için, birden fazla sunucu aynı anahtarı aynı anda güncelleyebilir ve değeri değiştirebilir.As UpdateAsync() daima güncellemeden önce en son değeri değiştirdiğiniz için, en son değeri çağrınızın girdisi olarak okumak için kullanmalısınız.

Örneğin, aşağıdaki kod örneği bir oyuncunun oyununda bir lider tablosundaki puanı günceller.Puan, öldürmeler / ölümler olarak hesaplanır.UpdateAsync() öldürmelerin ve ölümlerin en yeni değerler için güncellendiğinden emin olur, birden fazla oyun sunucusu aynı öğeyi aynı anda güncellemesine rağmen.Bir oyuncunun öldürmeleri ve ölümleri monotonik olarak artıyor ve bu nedenle sadece bir oturumda değer artışına sahip olabilir.

Sıralanmış Haritada bir oyuncunun liderlik puanını güncelleme

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` haritadaki öğeleri sıralamak için kullanılan sıralama anahtarıdır
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

UpdateAsync() için gecikme, rekabet olmadığı sürece GetAsync() ve SetAsync() ile benzerdir.

Anlaşmazlık meydana geldiğinde, sistem bu üç kişiden biri gerçekleşene kadar operasyonu otomatik olarak yeniden deneye alır: operasyon başarılı olur, geri çağrı işlevi nil veya maksimum deneme sayısına ulaşılır.Sistem maksimum sayıya ulaşırsa, bir çatışma döndürür.

Verileri kaldır

Sıralanmış haritadan bir anahtarı kaldırmak ve hafıza depolama sıralanmış haritadaki tüm verileri silmek için MemoryStoreSortedMap:RemoveAsync() kullanabilirsiniz.

Bir anahtarı kaldır

Anahtarı sıralanmış haritadan kaldırmak için, bir anahtar ile MemoryStoreSortedMap:RemoveAsync() adı çağırın.

Sıralanmış Haritadan bir Anahtarı Kaldır

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

Tüm verileri sil

Sıralanmış haritalardaki belleği silmek için, tüm anahtarları MemoryStoreSortedMap:GetRangeAsync() ile listeleyin, ardından onları MemoryStoreSortedMap:RemoveAsync() ile kaldırın.

Sıralanmış Haritada Hafızayı Silme

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Sıfırın ilk düşük sınırı, ilk öğeden başlayarak temizlenir
local exclusiveLowerBound = nil
while true do
-- Mevcut alt sınırdan başlayarak yüz tane öğeye kadar ulaşın
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
-- Eşyaları kaldırmakta bir hata varsa, aynı özel alt sınırla tekrar deneyin
if not removeSuccess then
warn(removeError)
-- Menzil yüzden az eşyadan az ise, haritanın sonuna ulaşılır
elseif #items < 100 then
break
else
-- Son alınan anahtar, bir sonraki döngü için özel alt sınırdır
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end