Bellek depoları

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

MemoryStoreService, bir canlı oturumda tüm sunuculardan erişilebilen hızlı bellek verisi depolaması sağlayan yüksek verimli ve düşük gecikmeli bir veri hizmetidir. Bellek Depoları, sık ve geçici olan, hızlı bir şekilde değişen ve kalıcı olmasını gerektirmeyen veriler için uygundur çünkü erişimi daha hızlıdır ve maksimum ömre ulaştığında kaybolur. Oturumlar arasında kalıcı olması gereken veriler için veri depoları kullanın.

Veri yapıları

Hammaddelere doğrudan erişmek yerine, bellek depoları hızlı işleme için sunucular arasında paylaşılan üç ilkel veri yapısına sahiptir: sıralı harita, kuyruk ve hash harita. Her bir veri yapısı, belirli kullanım senaryoları için iyi bir uyum içindedir:

  • Yetenek bazlı eşleştirme - Sunucular arasında paylaşılan bir kuyruk içinde kullanıcı bilgilerini, örneğin yetenek düzeyini kaydedin ve eşleştirmeyi periyodik olarak yürütmek için lobileri kullanın.
  • Sunucu arası ticaret ve açık artırma - Farklı sunucular arasında evrensel ticareti mümkün kılın; kullanıcılar, gerçek zamanlı değişen fiyatlarla öğelere teklif verebilir. Bunun için bir sıralı harita kullanılır.
  • Küresel liderlik tabloları - Kullanıcı sıralamalarını paylaşılan bir liderlik tablosunda güncellemek için sıralı harita içinde depolayın.
  • Paylaşılan envanterler - Kullanıcıların birbirleriyle eşzamanlı olarak envanter öğelerini kullanabilmesi için envanter öğelerini ve istatistiklerini paylaşılan bir hash harita içinde kaydedin.
  • Kalıcı Veri için Önbellek - Kalıcı verilerinizi bir veri deposundaki bir bellek deposu hash haritasına senkronize edin ve kopyalayın. Bu, önbellek işlevi görerek oyununuzun performansını artırabilir.

Genellikle, belirli bir anahtara göre verilere erişmeniz gerekiyorsa, bir hash harita kullanın. Verilerinizin sıralı olmasını istiyorsanız, bir sıralı harita kullanın. Verilerinizi belirli bir sırada işleme almanız gerekiyorsa, bir kuyruk kullanın.

Sınırlamalar ve kontroller

Ölçeklenebilirlik ve sistem performansını sürdürmek için bellek depolarının bellek boyutu, API istekleri ve veri yapısı boyutu için veri kullanımı kontrolleri vardır.

Bellek depolarının bir kullanım politikası vardır, bu da süresi dolan öğelerin atılması anlamına gelir; buna ömür süresi (TTL) de denir. Öğeler süresi dolduğunda atılır ve bellek kotası yeni girişler için serbest bırakılır. Bellek limitine ulaştığınızda, öğeler süresi dolana veya siz manuel olarak silene kadar tüm yazma istekleri başarısız olur.

Bellek boyutu kotası

Bellek kotası, bir oyunun tüketebileceği toplam bellek miktarını sınırlar. Sabit bir değer değildir; bunun yerine, oyundaki kullanıcı sayısına bağlı olarak zaman içinde değişir ve formülü 64KB + 1.2KB * [kullanıcı sayısı] şeklindedir. Kota, sunucu düzeyinde değil oyun düzeyinde geçerlidir.

Kullanıcılar oyuna katıldığında, ek bellek kotası hemen kullanılabilir. Kullanıcılar oyunundan ayrıldığında, kotanın anında azalması söz konusu değildir. Kotanın daha düşük bir değere yeniden değerlendirilmesi için sekiz gün süren bir izleme periyodu vardır.

Oyun bellek boyutu kotasına ulaştıktan sonra, belleği artıran herhangi bir API isteği her zaman başarısız olur. Bellek boyutunu azaltan veya değiştirmeyen istekler ise yine de başarılı olur.

Gözetim paneli ile oyununuzun bellek boyutu kotasını gerçek zamanlı olarak Bellek Kullanımı grafiğiyle görüntüleyebilirsiniz.

API istek limitleri

Bir istek birimi kotası, tüm MemoryStoreService API çağrılarına uygulanır. Bu kota, 1000 + 120 * [eşzamanlı kullanıcı sayısı] istek birimi dakikada geçerlidir.

Çoğu API çağrısı yalnızca bir istek birimi tüketirken, birkaç istisna bulunmaktadır:

  • MemoryStoreSortedMap:GetRangeAsync()

    Döndürülen öğelerin sayısına bağlı olarak birim tüketir. Örneğin, bu yöntem 10 öğe döndürürse, çağrı 10 istek birimi olarak sayılır. Eğer boş bir yanıt dönerse, bu bir istek birimi olarak sayılır.

  • MemoryStoreQueue:ReadAsync()

    MemoryStoreSortedMap:GetRangeAsync() gibi döndürülen öğelerin sayısına bağlı olarak birim tüketir, ancak okuma işlemi sırasında her iki saniyede bir ek birim tüketir. Maksimum okuma süresini waitTimeout parametresi ile belirtebilirsiniz.

  • MemoryStoreHashMap:UpdateAsync()

    En az iki birim tüketir.

  • MemoryStoreHashMap:ListItemsAsync()

    [tarayıcıya göre taranan bölüm sayısı] + [geri dönen öğeler] birim tüketir.

İstek kotası da oyun düzeyinde, sunucu düzeyinde değil uygulanmaktadır. Bu, toplam istek oranının kotaları aşmadığı sürece sunucular arasında istekleri dağıtma esnekliği sağlar. Eğer kotayı aşarsanız, isteklerinizin sınırlandırılması nedeniyle bir hata yanıtı alırsınız.

Gözetim özelliğiyle oyununuzun istek birimi kotasını gerçek zamanlı olarak görebilirsiniz.

Veri yapısı boyutu limitleri

Tek bir sıralı harita veya kuyruk için aşağıdaki boyut ve öğe sayısı limitleri geçerlidir:

  • Maksimum öğe sayısı: 1,000,000
  • Maksimum toplam boyut (sıralı harita için anahtarlar dahil): 100 MB

Bölüm başına limitler

bölüm başına limitler sayfasına bakın.

En iyi uygulamalar

Bellek kullanım deseninizi optimal tutmak ve sınırlara ulaşmaktan kaçınmak için şu en iyi uygulamalara uymanız önerilir:

  • İşlenen öğeleri kaldırın. MemoryStoreQueue:RemoveAsync() metodu ile kuyruklar için ve MemoryStoreSortedMap:RemoveAsync() metodu ile sıralı haritalar için okunan öğeleri düzenli olarak temizlemek, belleği serbest bırakabilir ve veri yapısını güncel tutabilir.

  • Veri eklerken son kullanma zamanını mümkün olan en kısa süre içinde ayarlayın. Her iki MemoryStoreQueue:AddAsync() ve MemoryStoreSortedMap:SetAsync() için varsayılan son kullanma süresi 45 gündür; ancak en kısa süreyi ayarlamak, ihtiyaç olmayan eski verilerin otomatik olarak kaldırılmasını sağlayarak bellek kullanım kotasının dolmasını önleyebilir.

    • Uzun bir son kullanma ile büyük miktarda veri depolamayın, çünkü bu bellek kotanızı aşma riski taşır ve bu, oyununuzu tamamen bozabilecek sorunlara yol açabilir.
    • Her zaman ihtiyaç duyulmayan öğeleri açıkça silin veya kısa bir öğe son kullanma süresi belirleyin.
    • Genel olarak, bellek serbest bırakmak için açık silmeyi kullanmalı ve uzun süre kullanılmayan öğelerin belleği kaplamasını önlemek için bir güvenlik mekanizması olarak öğe son kullanma sürelerini ayarlamalısınız.
  • Sadece gerekli değerleri belleklerinde saklayın.

    Örneğin, bir açık artırma evi oyununda, yalnızca en yüksek teklifi korumanız yeterlidir. Tüm teklifleri veri yapınızda tutmak yerine, en yüksek teklifi korumak için bir anahtar üzerinde MemoryStoreSortedMap:UpdateAsync() kullanabilirsiniz.

  • API istek limitlerinin altında kalmanıza yardımcı olmak için üstel geri alma kullanın.

    Örneğin, DataUpdateConflict hatası alırsanız, iki saniye sonra yeniden deneyebilir, ardından dört, sekiz, vb. şeklinde devam edebilirsiniz; sürekli olarak MemoryStoreService'e doğru yanıt almak için istekler göndermek yerine.

  • Devasa veri yapılarını parçalayarak daha küçük parçalara ayırın.

    Tüm verileri tek bir büyük veri yapısında depolamak yerine, daha küçük yapılarda verileri yönetmek genelde daha kolaydır. Bu yaklaşım, kullanım ve oran limitlerinin aşılmasını önlemeye de yardımcı olabilir. Örneğin, anahtarları için önekler kullanan bir sıralı haritanız varsa, her öneki kendi sıralı haritasına ayırmayı düşünün. Özellikle popüler bir oyun için, kullanıcıları kullanıcı kimliklerinin son rakamlarına göre birden fazla haritaya ayırabilirsiniz.

  • Hash haritalarında yük dağıtımı için anahtarların kopyaları ile parçalayın.

  • Saklanan değerleri sıkıştırın.

    Örneğin, saklanan değer boyutunu azaltmak için LZW algoritmasını kullanmayı düşünün.

  • Genişletilmiş Hizmetlere kaydolun.

    Genişletilmiş Hizmetler programına dahil olarak, Depolama ve İstek Limit kotanızı artırabilirsiniz.

Gözetim

Gözetim Paneli, bellek deposu kullanımınızı izlemenize ve sorun gidermenize yardımcı olacak içgörüler ve analizler sağlar. Bellek kullanımınız ve API isteklerinizin farklı yönleri hakkında gerçek zamanlı güncellenen grafiklerle, oyununuzun bellek kullanım desenini takip edebilir, mevcut tahsis edilen kotaları görüntüleyebilir, API durumunu izleyebilir ve performans optimizasyonu için potansiyel sorunları belirleyebilirsiniz.

Aşağıdaki tablo, Gözetim Paneli’nin Durum Başına İstek Sayısı ve API x Durum Başına İstekler grafiklerinde mevcut olan tüm API yanıt durum kodlarını listelemekte ve açıklamaktadır. Bu hataları nasıl çözeceğiniz hakkında daha fazla bilgi için Sorun Giderme bölümüne bakın. Bir hatanın ilgili olduğu özel kota veya limit için Sınırlamalar ve Kotalar bölümüne bakın.

Durum koduAçıklama
BaşarılıBaşarılı.
DataStructureMemoryOverLimitVeri yapısı düzeyindeki bellek boyutu limitini (100MB) aşar.
DataUpdateConflictEşzamanlı güncellemeler nedeniyle çelişki.
Erişim ReddedildiOyun verilerine erişim izni yok. Bu istek, istek birimlerini tüketmez veya kota kullanmaz.
İç Hataİç hata.
Geçersiz İstekİstek gerekli bilgilere sahip değil veya hatalı bilgilere sahiptir.
DataStructureItemsOverLimitVeri yapısı düzeyindeki öğe sayısı limitini (1M) aşar.
Hiçbir Öğe BulunamadıMemoryStoreQueue:ReadAsync() veya MemoryStoreSortedMap:UpdateAsync() içinde hiçbir öğe bulunamadı. ReadAsync() her iki saniyede bir sorgulama yapar ve kuyrukta öğe bulana kadar bu durum kodunu döndürür.
DataStructureRequestsOverLimitVeri yapısı düzeyindeki istek birimi limitini (dakikada 100,000 istek birimi) aşar.
PartitionRequestsOverLimitBölüm istek birimi limitini aşar.
TotalRequestsOverLimitEvrensel düzeyde istek birimi limitini aşar.
TotalMemoryOverLimitEvrensel düzeyde bellek kotasını aşar.
ItemValueSizeTooLargeDeğer boyutu limitini aşar (32KB).

Aşağıdaki tablo, şu anda Gözetim Paneli’nde mevcut olmayan istemci tarafı durum kodlarını listeler.

Durum koduAçıklama
İç Hataİç Hata.
Yayınlanmamış YerMemoryStoreService'i kullanmak için bu yeri yayınlamanız gerekir.
Geçersiz İstemci ErişimiMemoryStoreService sunucudan çağrılmalıdır.
Geçersiz Son Kullanma Süresiexpiration alanının zamanı 0 ile 3,888,000 arasında olmalıdır.
Geçersiz İstekDeğeri json'a dönüştürmek mümkün değil.
Geçersiz İstekSıralama anahtarını geçerli bir sayı veya dizeye dönüştürmek mümkün değil.
Dönüşüm Geri Çağırma BaşarısızDönüşüm geri çağırma işlevini çağırma başarısız oldu.
İstek SınırlandırıldıSon zamanlardaki MemoryStores istekleri bir veya daha fazla limite ulaştı.
Güncelleme ÇelişkisiMax deneme sayısının aşıldı.

Sorun Giderme

Aşağıdaki tablo, her yanıt durum kodu için önerilen çözümü listelemekte ve açıklamaktadır:

HataSorun Giderme seçenekleri
DataStructureRequestsOverLimit / PartitionRequestsOverLimit
  • 30 saniye gibi belirli bir zaman diliminden sonra tekrar kontrol etmek amacıyla bilgileri başka bir değişkende kaydederek yerel bir önbellek ekleyin.
  • Başarılı yanıtların sayısının Hiçbir Öğe Bulunamadı yanıtlarının sayısından daha fazla olduğunu doğrulamak için Durum Başına İstek Sayısı grafiğini kullanın. Başarısız bir istek ile MemoryStoreService'e olan isteklerinizi sınırlandırın.
  • İstekler arasında kısa bir gecikme uygulayın.
  • Aşağıdaki en iyi uygulamlara uyun:
    • Önemli miktarda DataStructureRequestsOverLimit/PartitionRequestsOverLimit yanıtı alıyorsanız, veri yapılarını parçalayın.
    • Hash harita anahtarlarını parçalayın, eğer hash harita çağrılarında önemli miktarda PartitionRequestsOverLimit yanıtı alıyorsanız.
    • PartitionRequestsOverLimit yanıtlara neden olan belirli veri yapıları veya hash harita anahtarlarının çağrılarını azaltın veya işleme koyun.
    • İstekler için akıllı bir oran bulmak amacıyla üstel geri alma uygulayın.
TotalRequestsOverLimit
DataStructureItemsOverLimit
DataStructureMemoryOverLimit
TotalMemoryOverLimit
DataUpdateConflict
  • Birden fazla isteği aynı anahtarı güncellemeye çalışmaktan kaçınmak için istekler arasında kısa bir gecikme uygulayın.
  • Sıralı haritalar için, girişiminizden belirli bir süre sonra istekleri iptal etmek amacıyla MemoryStoreSortedMap:UpdateAsync() yönteminde geri çağırma işlevini kullanın, aşağıdaki kod örneğinde olduğu gibi:
  • İstek İptali Örneği

    local MemoryStoreService = game:GetService("MemoryStoreService")
    local map = MemoryStoreService:GetSortedMap("AuctionItems")
    function placeBid(itemKey, bidAmount)
    map:UpdateAsync(itemKey, function(item)
    item = item or { highestBid = 0 }
    if item.highestBid < bidAmount then
    item.highestBid = bidAmount
    return item
    end
    print("öğe "..item.highestBid)
    return nil
    end, 1000)
    end
    placeBid("MyItem", 50)
    placeBid("MyItem", 40)
    print("tamamlandı")
  • MemoryStoreService'i etkili bir şekilde çağırarak çelişkileri önlemek için araştırma yapın. İdeal durumda, istekleri aşırı şekilde göndermemelisiniz.
  • Okunan öğeleri MemoryStoreQueue:RemoveAsync() metodu ile kuyruklar için ve MemoryStoreSortedMap:RemoveAsync() metodu ile sıralı haritalar için düzenli olarak kaldırın.
İç Hata
Geçersiz İstek
  • İsteğinizde doğru ve geçerli parametrelerin bulunduğundan emin olun. Geçersiz parametre örnekleri:
    • Boş bir dize
    • Uzunluk limitini aşan bir dize
Öğe Değer Boyutu Çok Büyük
  • Öğe değerini birden fazla anahtara parçalayın veya ayırın.
    • Gruplandırılmış anahtarları düzenlemek için, anahtar önüne prefix ekleyerek alfabe sırasına göre sıralayın.
  • Saklanan değerleri kodlayın veya sıkıştırın.

Stüdyoda test etme ve hata ayıklama

MemoryStoreService içindeki veriler Stüdyo ile üretim arasında izole edilmiştir, bu nedenle Stüdyodaki verileri değiştirmek, üretim davranışını etkilemez. Bu, Stüdyodan yaptığınız API çağrılarının üretim verilerine erişmemesi anlamına gelir; böylece bellek depolarını ve yeni özellikleri üretime geçmeden önce güvenle test edebilirsiniz.

Stüdyo testi, üretimdeki sınırlamalar ve kotalar ile aynı sınırlara sahiptir. Kullanıcı sayısına bağlı olarak hesaplanan kotalar için elde edilen kota çok küçük olabilir, zira Stüdyo testi için tek kullanıcı sizsiniz. Stüdyodan test yaparken, ayrıca üretimdeki kullanıma göre biraz daha yüksek gecikme ve artan hata oranları görebilirsiniz; bunun nedeni, erişim ve izinleri doğrulamak için gerçekleştirilen ek kontrollerdir.

Canlı oyunlarda veya stüdyoda bir bellek deposunu hata ayıklamak için Geliştirici Konsolu bölümüne bakın.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.