MemoryStore Veri Yapılarını Tasarlarken En İyi Uygulamalar

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

Veri yapısı yazbağlı olarak, MemoryStoreService, sınırları belleğe ve bir veri yapısındaki öğelerin sayısına uygulayabilir. Tüm veri yapıları global bir per-partition istek sınırına da sınırlar.

Her Roblox deneyiminin Hafıza Deposu Gözleme Dashboard , hafıza depolarını izlemek için kullanabileceğiniz bir dizi grafiği içerir.

Sıralanmış Haritalar ve Sıralama

Sıralanmış haritalar ve kuyrukların her ikisi de maksimum öğe sayısı ve maksimum toplam hafıza üzerinde sınırlara sahiptir. Ayrıca, bu veri yapılarındaki öğelerin her biri tek bir parçada sürekli olarak bulunur. Her bir veri yapısındaki istek, aynı parçaya her zaman bir istek gönderir.

Sıralama veya sıraya ulaştığında öğesi veya hafıza sınırına, en iyi eylem yapmak gerekir kullanıcının gereksiz öğeleri manuel olarak veya bir süreç koşulu ekleyerek kaldırmak. Aksi takdirde, sadece hafıza sınırının sınırlandırılması gerekiyor, kullanıcının gereksiz bilgileri çıkarır ve değer

Tüm öğelerinizin bir kısmını veya istek girişi nedeniyle gecikmeye uğradıysanız, tek çözüm sharding'dir.

Parçalanıyor

Parçalama, bir dizi ilgili verinin bir dizi bağlantılı veri yapısı üzerinde depolanmasıdır. Diğer bir deyişle, mevcut bir yüksek kapasiteli ver yapısının yerini alıp, aynı seti içeren daha küçük, daha küçük yapılar oluşturur.

Kırma için anahtar meydan okuma, verileri orijinal ile aynı işlevselliği koruyan şekilde çok sayıda veri yapısı arasında yaygınma yolunu bulmaktır.

Sıralanmış Bir Haritayı Parçalayan

Sıralanmış bir haritayı parçalamak için, verilerinizi karakter menzilleriyle alfabetik altbaşlıklara bölmeyi düşünün. Örneğin, A-Z'den ilk harf ile başlayan anahtarlarınız olduğunu ve mevcut kullanım vakası ve gelecekteki büyüme için dört anahtar olduğunu varsayalım:

  • İlk harita A-G, ikinci H-N, üçüncü O-T ve dördüncü U-Z'yi kapsayabilir.
  • Bir öğeyi gir veya almak için, öğenin başlangıç karakterine dayanarak uygun haritayı kullan.
Sıralanmış Bir Haritayı Parçalayan

-- MemoryStore Hizmetini Başlat
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Sıralama Haritanızın kovasını oluşturun
local sm_AtoG = MemoryStoreService:GetSortedMap("AtoG")
local sm_HtoM = MemoryStoreService:GetSortedMap("HtoM")
local sm_NtoT = MemoryStoreService:GetSortedMap("NtoT")
local sm_UtoZ = MemoryStoreService:GetSortedMap("UtoZ")
-- Eşya Anahtarından doğru kovayı almak için yardımcı işlevi
local function getSortedMapBucket(itemKey)
if (itemKey >= "a" and itemKey < "h") then
return sm_AtoG
elseif (itemKey < "n") then
return sm_HtoM
elseif (itemKey < "u") then
return sm_NtoT
else
return sm_UtoZ
end
end
-- Oyuncu isimlerini varsayılan değer 0 ile başlatın
for _, player in game:GetService("Players"):GetPlayers() do
local bucket = getSortedMapBucket(player)
bucket:SetAsync(player, 0, 600)
end
-- Bir oyuncunun değerini al
local player = "myPlayer"
local bucket = getSortedMapBucket(player)
local playerScore = bucket:GetAsync(player)
print(playerScore)

Bir Sırayı Bölme

Bir sırayı bölmek, sıralanmış bir haritayı bölmekten daha kolaydır. İstek girişi dağılımının herhangi bir sıradan girişine göre yalnızca ön veya arka tarafında görünür.

Bir çözüm, bir dizi'yi döndürmeyi kullanmak, yani bir öğeyi eklerken veya okurken dizi arasında döndürmeyi kullanmak:

  1. Birkaç sıra oluşturun ve bir matrisine ekleyin.

  2. İki yerel işaret oluşturun. Bunlardan biri okumak ve öğeleri kaldırmak istediğiniz sırayı temsil eder. Diğeri ise eklemek istediğiniz sırayı temsil eder:

    • Oku işlemleri için, her sıraya ihtiyacınız olan öğelerin sayısını ve okuma işaretçisini nereye hareket ettireceğinizi de hesaplayın.
    • Kaldırma işlemleri için, ID'leri her sıraya geçirin.
    • Ekleme işlemleri için eklemek işaretçisinde sıraya ekleyin ve işaretçiyi artırın.
Bir Sırayı Bölme

-- MemoryStore Hizmetini Başlat
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Sıralarını Oluştur
local q1 = MemoryStoreService:GetQueue("q1")
local q2 = MemoryStoreService:GetQueue("q2")
local q3 = MemoryStoreService:GetQueue("q3")
local q4 = MemoryStoreService:GetQueue("q4")
-- Sıraları Bir Matriste Olarak Yaz
local queueArr = { q1, q2, q3, q4 }
-- Okuyun indekslerini temsil eden iki gösterici oluşturun ve sıralar ekleyin
local readIndex = 1
local addIndex = 1
-- Dizinleri doğru güncellemeyi sağlayan yerel bir işlev oluşturun
local function rotateIndex(index, n)
return (index + n - 1) % 4 + 1
end
-- n öğelerini sıraya okuyan yerel bir işlev oluşturun
local function readFromQueue(count, allOrNothing, waitTimeout)
local endIndex = count % 4
local countPerQueue = count // 4
local items = {}
local ids = {}
-- her sırayla tekrar
for i = 1, 4, 1 do
-- bu sırayı ekstra bir öğe okuyup okumadığını belirleyin
local diff = i - readIndex
if diff < 0 then
diff += 4
end
local queue = queueArr[i]
-- her sırayından öğeleri oku
-- ekstra okuma kriterlerine uyarsa +1 öğe
if diff < endIndex then
items[i], ids[i] = queue:ReadAsync(countPerQueue + 1, allOrNothing,waitTimeout)
else
items[i], ids[i] = queue:ReadAsync(countPerQueue, allOrNothing,waitTimeout)
end
end
readIndex = rotateIndex(readIndex, count)
return items, ids
end
-- Sıraya n öğeleri kaldıran yerel bir işlev oluşturun
local function removeFromQueue(ids)
for i = 1, 4, 1 do
local queue = queueArr[readIndex]
queue:RemoveAsync(ids[i])
end
end
-- Sıraya bir öğe ekleyen yerel bir işlev oluşturur
local function addToQueue(itemKey, expiration, priority)
local queue = queueArr[readIndex]
queue:AddAsync(itemKey, expiration, priority)
addIndex = rotateIndex(addIndex, 1)
end
-- Biraz kod yazın!
for _, player in game:GetService("Players"):GetPlayers() do
addToQueue(player, 600, 0)
end
local players, ids = readFromQueue(20, true, -1)
removeFromQueue(ids)

Hizmet Haritası

Hash haritalarının her biri ayrı hafıza veya öğe sayısı sınırları yoktur ve otomatik olarak parçalanır, ancak onları kötü kullanırsanız bile sınırlandırma ile karşılaşabilirsiniz.

Örneğin, bir oyun verisinin bir hash haritasıyla kaydedilmiş bir deneyimi düşünün. Bu metin, metadata adındaki tek bir anahtarın değerinde saklanmış bir katmanlı yapı içeriyor. Bu metin, yerleşim kimliği, oyuncu sayısı ve daha fazlası gibi bil

Tüm metadatayı tek bir, göreici olmayan nesne olarak depolamak yerine, daha iyi yaklaşım her alanı kendi anahtarı olarak depolamaktır, böylece hash haritasından yararlanabilir. Eğer metadatayı ve diğer birincil haritası arasında ayrım gerektirse, bir isim özlü kullanıcı (örneğin