Hafıza depolama hashi haritası

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

Saldırgan haritalar , sıralanmış haritalara benzer, hafızada anahtar-değer çiftleri olarak depolanabilen verileri saklar.Sıralanmış haritalardan farklı olarak, hiçbir sıralama garantisi korumazlar.Bu veri yapısı, paylaşılan envanterler, fiziksel açık artırma evleri ve daha fazlası gibi basit veri depolama ve hızlı erişim gerektiren durumlar için yararlıdır.Hash haritaları verilerinizi otomatik olarak bölmeyi ele alır ve 1,000'den fazla anahtarınız varsa çok yararlıdır.Daha küçük anahtar alanları için, sıralı haritaları öneriyoruz .

Sınırlar

Hash haritalarının 128 karakterlik bir anahtar boyut sınırı ve 32 KB değer boyut sınırı vardır.

Aksi takdirde, hash haritaları diğer bellek depolama veri yapılarıyla aynı API isteği ve bellek kota sınırı sınırlarını kullanır.

Bir hash haritası alın

Bir hash haritası almak için, MemoryStoreService:GetHashMap() adıyla bir isim vererek çağırın.Adı deneyim içinde küreseldir, bu nedenle bu adı kullanarak herhangi bir senaryoda aynı hash haritasına erişebilirsiniz.

Bir Hash Haritası Almak

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")

Bir hash haritası aldıktan sonra, içinde veri okumak veya yazmak için aşağıdaki işlevlerden herhangi birini çağırın:

FonksiyonEylem
MemoryStoreHashMap:SetAsync()Ekle yeni bir anahtar veya anahtar zaten varsa değeri üzerine yazın.
MemoryStoreHashMap:GetAsync()Oku belirli bir anahtar.
MemoryStoreHashMap:ListItemsAsync()Bir hash haritasında öğeleri listele.
MemoryStoreHashMap:UpdateAsync()Güncelle bir anahtarı bir hash haritasından aldıktan sonra anahtarın değerini güncelle
MemoryStoreHashMap:RemoveAsync()Çıkar bir anahtarı hashed haritasından.

Her işlev hakkında derinlemesine dokümantasyon için, bakın MemoryStoreHashMap .

Verileri ekle veya üzerine yazın

Yeni bir anahtar eklemek veya anahtar değerini hashed haritada yeniden yazmak için, MemoryStoreHashMap:SetAsync() anahtarı ile adı , onun değeri ve bir son kullanma süresi saniye içinde ç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.

Bir Hash Haritasına Veri Ekleme

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end

Veri alın

Belirli bir anahtara bağlı bir değer alabilir veya hash haritasında çoklu anahtar-değer çiftleri alabilirsiniz.

Tek bir anahtarla veri alın

Hash haritasından bir anahtara bağlı bir değer almak için, anahtar ile MemoryStoreHashMap:GetAsync() adı çağırın.

Bir Hash Haritasından Özel Bir Anahtar Almak

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = hashMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end

Çoklu anahtar-değer çiftleriyle veri alın

Tek bir işlem olarak hash haritasındaki tüm anahtar-değer çiftlerini almak için, istenen sayfa boyutuyla MemoryStoreHashMap:ListItemsAsync() 'yi arayın.Bu işlev, sayfalanmış bir şekilde mevcut tüm anahtarları listeler.Örneğin, aşağıdaki kod örneği, hash haritasından 32 öğeye kadar alır.

Bir Hash Haritasında öğeleri listeleme

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Eşyaların listesini al, bir seferde 32 eşya
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Mevcut sayfayı al
local entries = pages:GetCurrentPage()
-- Sayfadaki tüm anahtar-değer çiftleri arasında dolaşın
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Son sayfaya ulaşıldı mı kontrol edin
if pages.IsFinished then
break
else
print("----------")
-- Sonraki sayfaya ilerleme
pages:AdvanceToNextPageAsync()
end
end
end

Verileri güncelle

Bir anahtarın değerini bir hash haritasından almak ve güncellemek için, anahtar MemoryStoreHashMap:UpdateAsync() ile çağrı , anahtarı güncellemek için bir çağrı işlevi ve bir saniye içinde son kullanma süresi ile bir çağrı yapın.

Ç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, paylaşılan bir envanterde bir kaynağın kaynak sayısını günceller.UpdateAsync() tüm oyuncu katkılarının bu paylaşılan envantere gireceğinden emin olur, bu katkılar aynı anda yapılsa bile.Bu işlevde ayrıca 500'e kadar maksimum kaynak sayısı uygular.

Paylaşılan Envanterdeki Bir Kaynağın Kaynak Sayısını Güncelleme

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("ResourceInventory")
local function contributeResources(itemResource, addedCount)
local success, newResourceCount = pcall(function()
return hashMap:UpdateAsync(itemResource, function(resource)
resource = resource or {count = 0}
resource.count = resource.count + addedCount
-- maksimum kaynak sayısını aşmadığımızdan emin olun
if resource.count > 500 then
resource.count = 500
end
return resource
end, 1200)
end)
if success then
print(newResourceCount)
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

MemoryStoreHashMap:RemoveAsync() her iki durumda da bir anahtarı hashed haritadan kaldırmak ve bir bellek depolama hafıza haritasındaki tüm verileri silmek için kullanabilirsiniz.

Bir anahtarı kaldır

Bir anahtarı hash haritasından kaldırmak için, bir anahtar ile MemoryStoreHashMap:RemoveAsync() adı çağırın.

Bir Anahtarı Hash Haritasından Kaldır

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
local setSuccess, _ = pcall(function()
return hashMap:SetAsync("User_1234", 1000, 30)
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end

Tüm verileri sil

Bir hash haritasındaki tüm verileri silmek için, tüm öğelerini MemoryStoreHashMap:ListItemsAsync() ile listeleyin, ardından onları MemoryStoreHashMap:RemoveAsync() ile kaldırın.

Bir Hash Haritasındaki tüm verileri sil

local MemoryStoreService = game:GetService("MemoryStoreService")
local hashMap = MemoryStoreService:GetHashMap("HashMap1")
-- Eşyaların listesini al, bir seferde 32 eşya
local success, pages = pcall(function()
return hashMap:ListItemsAsync(32)
end)
if success then
while true do
-- Mevcut sayfayı al
local entries = pages:GetCurrentPage()
local removeSuccess = true
local removeError = nil
-- Sayfadaki tüm anahtar-değer çiftleri arasında dolaşın
for _, entry in ipairs(entries) do
print(entry.key .. " : " .. tostring(entry.value))
removeSuccess, removeError = pcall(function()
hashMap:RemoveAsync(entry.key)
end)
if not removeSuccess then
warn(removeError)
end
end
-- Son sayfaya ulaşıldı mı kontrol edin
if pages.IsFinished then
print("Finished deleting all data.")
break
else
print("----------")
-- Sonraki sayfaya ilerleme
pages:AdvanceToNextPageAsync()
end
end
end