Hafıza 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 oturumdaki tüm sunuculardan erişilebilen hızlı bellek içi veri depolama sağlayan yüksek kapasiteli ve düşük gecikmeli veri hizmetidir. Hafıza Dükkanları , hızlı bir şekilde değişen ve dayanıklı olması gerekmeyen sık ve geçici verilere uygundur, çünkü erişimleri daha hızlıdır ve maksimum ömür süresine ulaştıklarında kaybolurlar.Oturumlar arasında sürekli kalması gereken veriler için, veri depoları kullanın.

Veri yapıları

Doğrudan brüt verilere erişmek yerine, hafıza depoları hızlı işlem için sunucular arasında paylaşılan üç ilkel veri yapısına sahiptir: sıralanmış harita , sıra ve hafıza haritası .Her veri yapısı belirli kullanım durumları için iyi bir uyumdur:

  • Beceri tabanlı eşleştirme - Kullanıcı bilgilerini, beceri seviyesi gibi, sunucular arasında paylaşılan bir sıraya kaydedin ve maç yapma dönemlerinde lobi sunucularını kullanarak kullanın.
  • Arası sunucu ticareti ve açık artırması - Kullanıcıların gerçek zaman değişen fiyatlarla eşyalara teklif verebilecekleri evrensel bir ticaret etkinleştirin, anahtar-değer çiftlerinin sıralanmış bir haritasıyla. - Enable universal trading between different servers, where users can bid on items with real-time changing prices, with a sorted map of key-value pairs.
  • Küresel lider tabloları - Bir sıralanmış haritanın içinde paylaşılan bir lider tablosunda kullanıcı rütbe sıralamalarını saklayın ve güncelleştirin.
  • Paylaşılan envanterler - Kullanıcıların envanter öğelerini birbiriyle aynı anda kullanabilmesine izin veren paylaşılan bir hash haritasında envanter öğeleri ve istatistikleri kaydedin.
  • Kalıcı Veriler için Önbellek - Kalıcı verilerinizi bir veri depolamasında bir bellek depolamasına senkronize edin ve kullanıcı deneyiminizin sözleşme imzalamaartırmak için bir önbellek haritası hashedleyin .

Genel genel, belirli bir anahtara dayalı verilere erişmeniz gerekiyorsa, bir hash haritası kullanın.Bu verilerin sipariş edilmesi gerekiyorsa, sıralı bir harita kullanın.Verilerinizi belirli bir sırayla işlemek zorunda kalırsanız, bir sıra kullanın.

Sınırlar ve kotalar

Ölçeklenebilirliği ve sistem sözleşme imzalamakorumak için, bellek depolarının bellek boyutu, API istekleri ve veri yapısı boyutu için veri kullanım kotası vardır.

Hafıza depolarının, son kullanma süresine dayalı bir tahliye politikası vardır, ayrıca yaşama süresi olarak bilinir (TTL).Öğeler sona erdikten sonra tahliye edilir ve hafıza kotası yeni girişler için serbest bırakılır.Hafıza sınırına ulaştığınızda, tüm sonraki yazma isteği başarısız olur veya eşyalar sona erene kadar manuel olarak silinir.

Hafıza boyutu kotası

Hafıza kotası, bir deneyimin tüketebileceği toplam hafızayı sınırlandırır.Sabit bir değer değil.Bunun yerine, deneyimdeki kullanıcı sayısına göre zamanla değişir ve aşağıdaki formüle göre değişir: 64KB + 1KB * [kullanıcı sayısı] .Kota, sunucu seviyesi yerine deneyim seviyesine uygulanır.

Kullanıcılar deneyime katıldığında, ekstra hafıza kotası hemen mevcut olur.Kullanıcılar deneyimi terk ettiğinde, kota hemen azalmaz.Kota daha düşük bir değere yeniden değerlendirilmeden önce sekiz günlük bir izleme süresi vardır.

Deneyiminiz bellek boyutu sınırına ulaştıktan sonra, bellek boyutunu artıran herhangi bir API isteği daima başarısız olur.Hafıza boyutunu azaltan veya değiştirmeyen istekler hala başarılıdır.

Gözlemlenebilirlik panosuyla, deneyiminizin bellek boyutu kotasını gerçek zamanda Hafıza Kullanımı grafiği kullanarak görebilirsiniz.

API istek sınırları

API istek sınırları için, tüm API çağrıları için uygulanan bir istenme birimi vardır.Kota 1000 + 100 * [çalışan kullanıcı sayısı] dakika başına istek birimi.

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

  • MemoryStoreSortedMap:GetRangeAsync()

    Döndürülen öğe sayısına dayalı birimleri tüketir.Örneğin, bu yöntem 10 öğe döndürürse, çağrı 10 istek birimi olarak sayılır.Boş bir yanıt döndürürse, bir istek birimi olarak sayılır.

  • MemoryStoreQueue:ReadAsync()

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

  • MemoryStoreHashMap:UpdateAsync()

    En az iki birim tüketir.

  • MemoryStoreHashMap:ListItemsAsync()

    Tüketir [taranan bölüm sayısı] + [iade edilen öğeler] birimler.

Talep kotası ayrıca sunucu seviyesi yerine deneyim seviyesine uygulanır.Bu, toplam istek oranı sınırın üzerine çıkmadığı sürece, istekleri sunucular arasında yerleştirmeye esneklik sağlar.Kota sınırını aşarsanız, hizmet isteklerinizi sınırlandığında bir hata yanıtı alırsınız.

Mevcut gözlemlenebilirlik özelliği ile deneyiminizin istek birimi kotasını gerçek zamanlı olarak görebilirsiniz.

Veri yapısı boyut sınırları

Tek bir sıralanmış harita veya sıra için, aşağıdaki boyut ve öğe sayısı sınırları uygulanır:

  • Maksimum eşya sayısı: 1,000,000
  • Toplam maksimum boyut (sıralanmış harita için anahtarlar dahil): 100 MB

Bölüm sınırları

Bakın her bölüm sınırı.

En iyi uygulamalar

Hafıza kullanım modelinizi optimal tutmak ve sınırlara ulaşmaktan kaçınmak için, şu en iyi uygulamaları izleyin:

  • İşlenmiş öğeleri kaldır.: Yığınlar ve sıralanmış haritalar için metodu kullanarak okunan öğeleri tutarlı bir şekilde temizlemek, hafızayı özgürleştirebilir ve veri yapısını güncel tutabilir.

  • Veri eklerken mümkün olan en küçük zaman dilimine son kullanma süresini ayarlayın.: Varsayılan süre dolum süresi her iki durumda da 45 gün olmasına rağmen, en kısa olası süreyi ayarlamak, hafıza kullanım kotanızı doldurmalarını engellemek için eski verileri otomatik olarak temizleyebilir.

  • Uzun bir sona sahip büyük miktarda veri depolamayın, çünkü hafıza sınırınızı aşmak ve tüm deneyiminizi bozabilecek sorunlara neden olma riski taşıyor.

  • Her zaman gerekli olmayan öğeleri açıkça sil veya kısa bir öğe süresi ayarlayın.

  • Genel olarak, bellek ve öğe süresi sona ermesini güvenlik mekanizması olarak uzun bir süre boyunca belleği işgal etmekten kaçınmak için açık silmeyi kullanmalısınız.

  • Sadece gerekli değerleri belleğe tutun.

    Örneğin, bir ihale evi deneyimi için, yalnızca en yüksek teklifi korumana ihtiyacınız var.Tüm teklifleri veri yapınızda tutmak yerine en yüksek teklifi korumak için bir anahtarda MemoryStoreSortedMap:UpdateAsync() kullanabilirsiniz.

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

    Örneğin, bir DataUpdateConflict alırsanız, iki saniye sonra, dört, sekiz vb. yeniden deneyebilirsiniz.Doğru yanıtı almak için sürekli olarak MemoryStoreService 'ye istek göndermek yerine.

  • Devasa veri yapılarını parçalama ile birden fazla küçük yapıya bölünüz.

    Bütün verileri tek bir büyük veri yapısında depolamak yerine, daha küçük yapılarda verileri yönetmek genellikle daha kolaydır.Bu yaklaşım ayrıca kullanım ve oran sınırlarının önlenmesine yardımcı olabilir.Örneğin, anahtarları için tercihler kullanan sıralı bir haritanız varsa, her bir tercihi kendi sıralı haritasına ayırmayı düşünün.Özellikle popüler bir deneyim için, kullanıcıların kullanıcı kimliklerinin son sayılarına dayanarak birden fazla haritaya bölünebilirsiniz.

  • Depolanmış değerleri sıkıştır.

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

Gözlemlenebilirlik

Gözlemlenebilirlik Panosu, hafıza depolama kullanımınızı izleme ve sorun giderme için bilgiler ve analizler sağlar.Hafıza kullanımının ve API isteklerinin farklı yönlerinde gerçek zaman güncelleme tablolarıyla, deneyiminizin hafıza kullanımı modelini izleyebilir, mevcut ayrılan kotaları görebilir, API durumunu izleyebilir ve performans optimizasyonu için potansiyel sorunları tanımlayabilirsiniz.

Aşağıdaki tablo, Observability Dashboard'daki Durum Kodlarına Göre İstek Sayısı ve API x Durum ile İstekler tablolarında mevcut API yanıtlarının tüm durum kodlarını listeler ve açıklar.Bu hataların nasıl çözüleceğine dair daha fazla bilgi için, Sorun Giderme bakın.Bir hata ile ilgili belirli kota veya sınır için, bakın Sınırlar ve Kotalar.

Durum koduAçıklama
BaşarıBaşarı.
Veri Yapısı Hafıza Sınırını AşmaVeri yapısı seviye bellek boyutu sınırını aşar (100MB).
VeriGüncellemeÇatışmasıEşzamanlı güncelleme nedeniyle çatışma.
Erişim ReddedildiDeneyim veriye erişimi yetkisiz. Bu istek, istek birimlerini tüketmez veya kota kullanmaz.
İçsel HataDahili hata.
Geçersiz İstekİstek gerekli bilgilere sahip değil veya yanlış bilgiye sahip.
Veri Yapısı Öğeleri Sınırının Üzerinde DataStructureItemsOverLimitVeri yapısı seviyesi öğe sayı sınırını aşar (1M).
NoItemFound bulunamadıMemoryStoreQueue:ReadAsync() veya MemoryStoreSortedMap:UpdateAsync() 'de herhangi bir öğe bulunamadı. ReadAsync() her 2 saniye anket yapar ve sıraya öğeler bulana kadar bu durum kodunu geri döndürür.
Veri Yapısı İstekleri Sınırın Üzerinde DataStructureRequestsOverLimitVeri yapısı seviye istek birim sınırını aşar (dakika başına 100,000 istek birimi).
Bölüm İstekleri Sınırının Üzerindeki İsteklerBölüm isteği birimi sınırını aşar.
Toplam İstekler Sınırını AştıEvren seviyesi istek birimi sınırını aşar.
Toplam Hafıza Sınırını AşmaEvren seviyesi bellek kotasını aşar.
EşyaDeğeri Boyutu Çok BüyükDeğer boyutu sınırı aşıyor (32KB).

Aşağıdaki tablo, mevcut olmayan durum kodlarını listeler, şu anda Gözlem Ekranı'nda mevcut değil.

Durum koduAçıklama
İçsel HataDahili Hata.
Yayınlanmamış YerMemoryStoreService'i kullanmak için bu yeri yayınlamanız gerekir.
Geçersiz Müşteri ErişimiMemoryStoreService, sunucudan çağrılmalıdır.
GeçersizSonaErmeSüresiSüre 'son kullanma' alanı 0 ile 3,888,000 arasında olmalıdır.
Geçersiz İstekDeğeri json'a dönüştüremiyoruz.
Geçersiz İsteksortKey'i geçerli bir sayı veya dizidönüştüremiyor.
TransformCallbackBaşarısızDönüşüm geri çağırma işlevi çağrılamadı.
İstekSınırlandıYakın MemoryStores istekleri bir veya daha fazla sınıra ulaştı.
Güncelleme ÇatışmasıMaksimum yeniden deneme sayısı aşıldı.

Sorun çözme

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

Error İngilizce: Error

Sorun giderme seçenekleri
Veri Yapısı İstekleri Sınırının Üzerinde / Bölüm İstekleri Sınırının Üzerinde
  • Bilgileri başka bir değişkene kaydederek yerel bir önbellek ekleyin ve 30 saniye gibi belli bir süre aradan sonra yeniden kontrol edin.:
  • Durum bazında İstek Sayısı grafiğini kullanarak, daha fazla Başarı yanıtı aldığınızdan emin olun NoItemFounds .Başarısız bir istek ile MemoryStoreService talepvurma miktarını sınırla.:
  • İstekler arasında kısa bir gecikme uygulayın.:
  • En iyi uygulamaları takip edin, bunlar arasında:
    • Veri yapılarınızı önemli bir miktar DataStructureRequestsOverLimit / Bölüm istekleri sınırı yanıtı aldığınızda parçalayın.:
    • gönderiçin makul bir istek oranı bulmak için üstel bir geri çekme uygulayın.
Toplam İstekler Sınırını Aştı
Veri Yapısı Öğeleri Sınırının Üzerinde DataStructureItemsOverLimit
Veri Yapısı Hafıza Sınırını Aşma
Toplam Hafıza Sınırını Aşma
VeriGüncellemeÇatışması
  • Aynı anda aynı anahtarı güncellemekten kaçınmak için istekler arasında kısa bir gecikme uygulayın.:
  • Sıralanmış haritalar için, bir dizi denemeden sonra bir isteği iptal etmek için MemoryStoreSortedMap:UpdateAsync() yöntemindeki geri çağrı işlevini kullanın, aşağıdaki kod örneği gösterdiği gibi:
  • Example of Aborting Request

    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("item is "..item.highestBid)
    return nil
    end, 1000)
    end
    placeBid("MyItem", 50)
    placeBid("MyItem", 40)
    print("done")
  • Çatışmaları önlemek için verimli bir şekilde çağrıp çağırmadığınızı görmek için araştırın MemoryStoreService .İdeal olarak, talepleri aşırı göndermemelisiniz.:
  • Öğeleri, sıralı süreçler ve sıralı haritalar için MemoryStoreQueue:RemoveAsync() yöntemi kullanılarak okunduktan sonra tutarlı bir şekilde kaldırın.
İçsel Hata
  • Roblox durum sayfasını kontrol edin .
  • Deneyiminizin Evren ID'si ile sorunu tanımlayan bir hata raporu dosyası gönderin.
Geçersiz İstek
  • İsteğinize doğru ve geçerli parametler dahil ettiğinizden emin olun. Geçersiz parametre örnekleri şunları içerir:
    • Boş bir dize
    • Uzunluk sınırını aşan bir dize
    • >

EşyaDeğeri Boyutu Çok Büyük
  • Eşya değerini birden çok anahtara bölün veya bölün.
    • Grup halinde anahtarları düzenlemek için, anahtara bir prefix ekleyerek alfabetik olarak sıralayın.
  • Depolanmış değerleri kodlamak veya sıkıştırmak.

Studio'da test ve hata ayıklama

MemoryStoreService 'deki veriler Studio ve üretim arasında izole edilmiştir, bu nedenle Studio'daki verileri değiştirmek üretim davranışını etkilemez.Bu, Studio'dan API çağrılarının üretim verilerine erişmediği ve böylece üretime gitmeden önce güvenle bellek depolarını ve yeni özellikleri test edebileceğiniz anlamına gelir.

Stüdyo testi, üretimle aynı sınırlara ve kotalara sahiptir.Kullanıcı sayısına dayalı olarak hesaplanan kotalar için, Studio testi için tek kullanıcı olduğunuz için sonuç kotası çok küçük olabilir.Stüdyodan test yaparken, erişim ve izinlerin doğrulanması için yapılan bazı ek kontroller nedeniyle üretimde kullanıma kıyasla biraz daha yüksek gecikme ve hata oranları fark edebilirsiniz.

Canlı deneyimlerde bir bellek depolamasını nasıl depura edeceğiniz veya stüdyoda test ederken bilgi almak için Geliştirici Konsolu kullanın.