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, canlı bir oturumda tüm sunuculardan erişilebilen hızlı bellek içi veri depolama sağlayan yüksek verimli ve düşük gecikmeli bir veri hizmetidir. Bellek Depoları, sık ve geçici veriler için uygundur; çünkü bu veriler hızla değişir ve kalıcı olmaları gerekmez, çünkü erişim açısından daha hızlıdırlar ve maksimum ömre ulaştıklarında kaybolurlar. Oturumlar arasında kalıcı olması gereken veriler için veri depolarını kullanın.

Veri yapıları

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

  • Yetenek bazlı eşleştirme - Kullanıcı bilgilerini, örneğin yetenek seviyesini, sunucular arasında paylaşılan bir kuyrukta saklayın ve eşleştirmeyi periyodik olarak yürütmek için lobideki sunucuları kullanın.
  • Sunucular arası ticaret ve açık artırma - Kullanıcıların gerçek zamanlı değişen fiyatlarla öğelere teklif verebileceği, farklı sunucular arasında evrensel ticareti etkinleştirin; bu, anahtar-değer çiftlerinin sıralı haritası ile yapılır.
  • Küresel liderlik tabloları - Kullanıcı sıralamalarını paylaşılan bir liderlik tablosunda sıralı harita içinde saklayın ve güncelleyin.
  • Paylaşılan envanterler - Kullanıcıların birbirleriyle eşzamanlı olarak envanter öğelerini kullanabileceği bir paylaşılan hash harita içinde envanter öğelerini ve istatistiklerini saklayın.
  • Kalıcı Veriler için Önbellek - Kalıcı verilerinizi bir veri deposunda senkronize edin ve kopyalayın, böylece bir bellek deposu hash haritası olarak önbellek işlevi görebilir ve oyununuzun performansını artırabilir.

Genel olarak, belirli bir anahtara dayalı verilere erişmeniz gerekiyorsa, bir hash harita kullanın. Verilerin sıralı olmasını istiyorsanız, bir sıralı harita kullanın. Verilerinizi belirli bir sırada işlemek istiyorsanız, bir kuyruk kullanın.

Sınırlamalar ve kotalar

Ölçeklenebilirliği ve sistem performansını korumak için, bellek depolarının bellek boyutu, API istekleri ve veri yapısı boyutu için veri kullanımı kotaları vardır.

Bellek depoları, son kullanma süresine dayalı bir tahliye politikası uygular; bu, yaşam süresi (TTL) olarak da bilinir. Öğeler süresi dolduğunda tahliye edilir ve bellek kotası yeni girişler için serbest bırakılır. Bellek sınırına ulaştığınızda, tüm sonraki yazma istekleri, öğeler süresi dolana kadar veya manuel olarak silinene kadar başarısız olur.

Bellek boyutu kotası

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

Kullanıcılar oyuna katıldığında, ek bellek kotası hemen kullanılabilir hale gelir. Kullanıcılar oyundan ayrıldığında, kota hemen azalmaz. Kotanın daha düşük bir değere yeniden değerlendirilmesi için sekiz günlük bir geri izleme süresi vardır.

Oyununuza ait bellek boyutu kotasına ulaştığınızda, bellek boyutunu 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 panosuyla, oyununuzun bellek boyutu kotasını gerçek zamanlı olarak Bellek Kullanımı grafiği ile görüntüleyebilirsiniz.

API istek sınırları

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 olarak dakikada geçerlidir.

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

  • MemoryStoreSortedMap:GetRangeAsync()

    Döndürülen öğe sayısına göre 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, bir istek birimi olarak sayılır.

  • MemoryStoreQueue:ReadAsync()

    Döndürülen öğe sayısına göre birim tüketir, MemoryStoreSortedMap:GetRangeAsync() gibi, ancak okuma sırasında her iki saniyede bir ek birim tüketir. Maksimum okuma süresini waitTimeout parametresi ile belirtin.

  • MemoryStoreHashMap:UpdateAsync()

    En az iki birim tüketir.

  • MemoryStoreHashMap:ListItemsAsync()

    [tarayıcıda taranan bölümlerin sayısı] + [döndürülen öğeler] birim tüketir.

İstek kotası da sunucu düzeyinde değil, oyun düzeyinde uygulanır. Bu, toplam istek oranı kotayı aşmadığı sürece sunucular arasında istekleri dağıtma esnekliği sağlar. Kota aşıldığında, isteklerinizi kısıtladığında bir hata yanıtı alırsınız.

Gözetim özelliği ile, oyununuzun istek birimi kotasını gerçek zamanlı olarak görüntüleyebilirsiniz.

Veri yapısı boyutu sınırları

Tek bir sıralı harita veya kuyruk için aşağıdaki boyut ve öğe sayısı sınırları 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 sınırlar

Bölüm başına sınırlar bölümüne bakın.

En iyi uygulamalar

Bellek kullanım deseninizi optimal tutmak ve sınırlara ulaşmaktan kaçınmak için bu en iyi uygulamaları izleyin:

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

  • Veri eklerken son kullanma süresini mümkün olan en kısa zaman dilimine ayarlayın. MemoryStoreQueue:AddAsync() ve MemoryStoreSortedMap:SetAsync() için varsayılan son kullanma süresi 45 gündür; ancak mümkün olan en kısa süreyi ayarlamak, eski verilerin otomatik olarak temizlenmesini sağlayarak bellek kullanım kotanızı doldurmalarını önleyebilir.

    • Uzun bir son kullanma süresi ile büyük miktarda veri saklamayın, çünkü bu bellek kotanızı aşma riski taşır ve tüm oyununuzu bozabilecek sorunlara yol açabilir.
    • Her zaman ya gereksiz öğeleri açıkça silin ya da kısa bir öğe son kullanma süresi ayarlayın.
    • Genel olarak, bellek serbest bırakmak için açık silme kullanmalısınız ve kullanılmayan öğelerin uzun süre bellek kaplamasını önlemek için öğe son kullanma süresini bir güvenlik mekanizması olarak kullanmalısınız.
  • Bellekte yalnızca gerekli değerleri tutun.

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

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

    Örneğin, bir DataUpdateConflict aldığınızda, iki saniye sonra yeniden deneyebilir, ardından dört, sekiz vb. yapabilirsiniz; sürekli olarak MemoryStoreService'e doğru yanıt almak için istek göndermek yerine.

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

    Verileri daha küçük yapılarda yönetmek genellikle daha kolaydır; her şeyi tek bir büyük veri yapısında saklamak yerine. Bu yaklaşım, kullanım ve oran sınırlarını aşmaktan kaçınmanıza da 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ırmayı bile düşünebilirsiniz.

  • Hash haritalarında yükü dağıtmak için anahtarların birden fazla kopyası ile sık erişilen anahtarları 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 ile kaydolduğunuzda, Depolama ve İstek Limit kotanızı artırabilirsiniz.

Gözetim

Gözetim Panosu, bellek depoları kullanımınızı izlemek ve sorun gidermek için içgörüler ve analizler sağlar. Bellek kullanımınızın 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 Panosu'ndaki Duruma Göre İstek Sayısı ve API x Duruma Göre İstekler grafiklerinde mevcut olan API yanıtlarının tüm durum kodlarını listeler ve açıklar. Bu hataları nasıl çözeceğiniz hakkında daha fazla bilgi için Sorun Giderme bölümüne bakın. Bir hatanın ilişkili olduğu belirli kota veya sınır 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 sınırını aşar (100 MB).
DataUpdateConflictEşzamanlı güncelleme nedeniyle çakışma.
AccessDeniedOyun verilerine erişim yetkisi yok. Bu istek, istek birimlerini tüketmez veya kota kullanmaz.
InternalErrorİç hata.
InvalidRequestİstek gerekli bilgilere sahip değil veya biçimi bozuk.
DataStructureItemsOverLimitVeri yapısı düzeyindeki öğe sayısı sınırını aşar (1M).
NoItemFoundMemoryStoreQueue:ReadAsync() veya MemoryStoreSortedMap:UpdateAsync() içinde öğe bulunamadı. ReadAsync() her 2 saniyede bir anket yapar ve kuyrukta öğe bulana kadar bu durum kodunu döndürür.
DataStructureRequestsOverLimitVeri yapısı düzeyindeki istek birimi sınırını aşar (dakikada 100,000 istek birimi).
PartitionRequestsOverLimitBölüm istek birimi sınırını aşar.
TotalRequestsOverLimitEvrensel düzeyde istek birimi sınırını aşar.
TotalMemoryOverLimitEvrensel düzeyde bellek kotasını aşar.
ItemValueSizeTooLargeDeğer boyutu sınırı aşar (32 KB).

Aşağıdaki tablo, şu anda Gözetim Panosu'nda mevcut olmayan istemci tarafı durum kodlarını listeler.

Durum koduAçıklama
InternalErrorİç Hata.
UnpublishedPlaceMemoryStoreService'i kullanmak için bu yeri yayınlamanız gerekir.
InvalidClientAccessMemoryStoreService sunucudan çağrılmalıdır.
InvalidExpirationTime'expiration' alanı süresi 0 ile 3,888,000 arasında olmalıdır.
InvalidRequestDeğeri json'a dönüştürmek mümkün değil.
InvalidRequestsortKey'i geçerli bir sayı veya dizeye dönüştürmek mümkün değil.
TransformCallbackFailedDönüşüm geri çağırma işlevini çağırmak başarısız oldu.
RequestThrottledSon zamanlarda MemoryStores istekleri bir veya daha fazla sınıra ulaştı.
UpdateConflictMaksimum yeniden deneme sayısını aştı.

Sorun Giderme

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

HataSorun Giderme seçenekleri
DataStructureRequestsOverLimit / PartitionRequestsOverLimit
  • Bilgileri başka bir değişkende saklayarak yerel bir önbellek ekleyin ve belirli bir zaman aralığı (örneğin 30 saniye) sonra yeniden kontrol edin.
  • Başarılı yanıtların NoItemFound yanıtlarından daha fazla olduğunu doğrulamak için Duruma Göre İstek Sayısı grafiğini kullanın. Başarısız bir istekle MemoryStoreService'e ne kadar sık girdiğinizi sınırlayın.
  • İstekler arasında kısa bir gecikme uygulayın.
  • Aşağıdaki en iyi uygulamaları izleyin:
    • Önemli miktarda DataStructureRequestsOverLimit/PartitionRequestsOverLimit yanıtı alıyorsanız, veri yapılarını parçalayın.
    • Hash harita anahtarlarınızı parçalayın, eğer hash harita çağrılarında önemli miktarda PartitionRequestsOverLimit yanıtı alıyorsanız.
    • Belirli veri yapıları veya hash harita anahtarlarına yapılan çağrıları azaltın veya gruplandırın, eğer PartitionRequestsOverLimit yanıtları görüyorsanız.
    • Gönderilecek isteklerin makul bir oranını bulmak için üstel geri çekilme uygulayın.
TotalRequestsOverLimit
DataStructureItemsOverLimit
DataStructureMemoryOverLimit
TotalMemoryOverLimit
DataUpdateConflict
  • Aynı anahtarı aynı anda güncellemeye çalışan birden fazla isteği önlemek için istekler arasında kısa bir gecikme uygulayın.
  • Sıralı haritalar için, belirli bir deneme sayısından sonra isteği iptal etmek için MemoryStoreSortedMap:UpdateAsync() yönteminde geri çağırma işlevini kullanın; aşağıdaki kod örneği bunu göstermektedir:
  • İsteği İptal Etme Ö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ı")
  • Çakışmaları önlemek için MemoryStoreService'i verimli bir şekilde çağırıp çağırmadığınızı kontrol edin. İdeal olarak, istekleri aşırı göndermemelisiniz.
  • Okunan öğeleri sürekli olarak kaldırın; kuyruklar için MemoryStoreQueue:RemoveAsync() yöntemini ve sıralı haritalar için MemoryStoreSortedMap:RemoveAsync() yöntemini kullanın.
İç Hata
Geçersiz İstek
  • İsteğinizde doğru ve geçerli parametreler içerdiğinizden emin olun. Geçersiz parametre örnekleri şunlardır:
    • Boş bir dize
    • Uzunluk sınırını aşan bir dize
ItemValueSizeTooLarge
  • Öğe değerini birden fazla anahtara parçalayın veya bölün.
    • Gruplandırılmış anahtarları düzenlemek için, anahtara bir prefix ekleyerek alfabetik olarak 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şmediği anlamına gelir; böylece bellek depolarını ve yeni özellikleri üretime geçmeden önce güvenle test edebilirsiniz.

Stüdyo testi, üretimle aynı sınırlara ve kotalara sahiptir. Kullanıcı sayısına bağlı olarak hesaplanan kotalar için, sonuçta oluşan kota çok küçük olabilir, çünkü Stüdyo testi için tek kullanıcı sizsiniz. Stüdyodan test yaparken, ayrıca erişim ve izinleri doğrulamak için gerçekleştirilen bazı ek kontroller nedeniyle üretimdeki kullanıma kıyasla biraz daha yüksek gecikme ve artan hata oranları fark edebilirsiniz.

Canlı oyunlarda veya stüdyoda bir bellek deposunu nasıl hata ayıklayacağınız hakkında bilgi 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.