Toko ingatan

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

MemoryStoreService adalah layanan data putaran tinggi dan latensi rendah yang menyediakan penyimpanan data dalam memori cepat yang dapat diakses dari semua server dalam sesi langsung. Toko Memori cocok untuk data yang sering dan sementara yang berubah dengan cepat dan tidak perlu menjadi tahan lama, karena lebih cepat diakses dan lenyap saat mencapai masa hidup maksimum.Untuk data yang perlu bertahan melintasi sesi, gunakan toko data.

Struktur data

Alih-alih mengakses data mentah secara langsung, penyimpanan memori memiliki tiga struktur data primitif yang dibagikan di antara server untuk pemrosesan cepat: peta diurutkan , antrian , dan peta hash .Setiap struktur data adalah cocok untuk kasus penggunaan tertentu:

  • Pencocokan berdasarkan keterampilan - Simpan informasi pengguna, seperti levelketerampilan, di antara server bersama, dan gunakan server lobi untuk menjalankan periode pencocokan secara berkala.
  • Perdagangan dan lelang antar server - Aktifkan perdagangan universal di antara server yang berbeda, di mana pengguna dapat menawar item dengan harga berubah real time, dengan peta kunci-nilai pasangan kunci.
  • Papan peringkat global - Menyimpan dan memperbarui peringkat pengguna di papan peringkat bersama di dalam peta terurut .
  • Inventaris bersama - Simpan item inventaris dan statistik di peta hash bersama, di mana pengguna dapat menggunakan item inventaris secara bersamaan dengan satu sama lain.
  • Cache untuk Data Tetap - Sinkronkan dan salin data tetap Anda ke penyimpanan memori ke dalam cache peta hash yang dapat bertindak sebagai cache dan meningkatkan pelaksanaanpengalaman.

Secara umum, jika Anda perlu mengakses data berdasarkan unittertentu, gunakan peta hash.Jika Anda membutuhkan data tersebut untuk dipesan, gunakan peta yang disortir.Jika Anda perlu memproses data Anda dalam urutan tertentu, gunakan antrian.

Batas dan kuota

Untuk mempertahankan pelaksanaandan kinerja sistem, penyimpanan memori memiliki kuota penggunaan data untuk ukuran memori, permintaan API, dan ukuran struktur data.

Toko memori memiliki kebijakan eviksi berdasarkan waktu kedaluwarsa, juga dikenal sebagai waktu untuk hidup (TTL).Item diusir setelah mereka kedaluwarsa, dan kuota memori dibebaskan untuk entri baru.Ketika Anda mencapai batas memori, semua permintaan penulisan berikutnya gagal sampai item kedaluwarsa atau Anda secara manual menghapusnya.

Kuota ukuran memori

Kuota memori membatasi jumlah memori total yang dapat dikonsumsi oleh pengalaman.Ini bukan nilai tetap.Sebagai gantinya, itu berubah seiring waktu tergantung pada jumlah pengguna dalam pengalaman sesuai dengan formula berikut: 64KB + 1KB * [jumlah pengguna] .Kuota diterapkan pada tingkat pengalaman bukan levelserver.

Ketika pengguna bergabung dengan pengalaman, kuota memori tambahan tersedia segera.Ketika pengguna meninggalkan pengalaman, kuota tidak berkurang secara langsung.Ada periode pelacakan kembali selama delapan hari sebelum kuota diuji ulang ke nilai yang lebih rendah.

Setelah pengalaman Anda mencapai batas ukuran memori, semua permintaan API yang meningkatkan ukuran memori selalu gagal.Permintaan yang mengurangi atau tidak mengubah ukuran memori masih berhasil.

Dengan dashboard pengamatan, Anda dapat melihat kuota ukuran memori pengalaman Anda secara real time menggunakan grafik Penggunaan Memori .

Batas permintaan API

Untuk batas permintaan API, ada kuota permintaan unit yang berlaku untuk semua panggilan API MemoryStoreService.Kuota adalah 1000 + 100 * [jumlah pengguna bersamaan] unit permintaan per menit.

Kebanyakan panggilan API hanya mengkonsumsi satu unit permintaan, dengan beberapa pengecualian:

  • MemoryStoreSortedMap:GetRangeAsync()

    Konsumsi unit berdasarkan jumlah item yang dikembalikan.Sebagai contoh, jika metode ini mengembalikan 10 item, panggilan dihitung sebagai 10 unit permintaan.Jika ia mengembalikan respons kosong, ia dihitung sebagai satu unit permintaan.

  • MemoryStoreQueue:ReadAsync()

    Mengkonsumsi unit berdasarkan jumlah item yang dikembalikan, seperti MemoryStoreSortedMap:GetRangeAsync() , tetapi mengkonsumsi unit tambahan setiap dua detik saat membaca.Spesifikasikan waktu baca maksimum dengan parameter waitTimeout.

  • MemoryStoreHashMap:UpdateAsync()

    Mengkonsumsi minimal dua unit.

  • MemoryStoreHashMap:ListItemsAsync()

    Mengkonsumsi [jumlah partisi yang dipindai] + [item yang dikembalikan] unit.

Kuota permintaan juga diterapkan pada tingkat pengalaman bukan pada tingkat server.Ini memberikan fleksibilitas untuk mengalokasikan permintaan di antara server selama tingkat permintaan total tidak melebihi kuota.Jika Anda melebihi kuota, Anda menerima respons kesalahan saat layanan membatasi permintaan Anda.

Dengan fitur observabilitas yang tersedia, Anda dapat melihat kuota unit permintaan pengalaman Anda secara real time.

Batas ukuran struktur data

Untuk satu peta atau antrian terurut, batas ukuran dan jumlah item berikut berlaku:

  • Jumlah maksimum item: 1.000.000
  • Ukuran total maksimum (termasuk kunci untuk peta terurut): 100 MB

Batas per-bagian

Lihat batas per-partisi.

Praktik terbaik

Untuk menjaga pola penggunaan memori Anda optimal dan menghindari mencapai batas , ikuti praktik terbaik berikut:

  • Hapus item yang diproses.: Secara konsisten membersihkan item baca menggunakan metode MemoryStoreQueue:RemoveAsync() untuk antrian dan MemoryStoreSortedMap:RemoveAsync() untuk peta terurut dapat membebaskan memori dan menjaga struktur data tetap up-to-date.

  • Tetapkan waktu kedaluwarsa ke frame waktu terkecil yang mungkin saat menambahkan data.: Meskipun waktu kedaluwarsa default adalah 45 hari untuk kedua MemoryStoreQueue:AddAsync() dan MemoryStoreSortedMap:SetAsync(), mengatur waktu paling singkat yang mungkin dapat secara otomatis membersihkan data lama untuk mencegah mereka mengisi kuota penggunaan memori Anda.

    • Jangan menyimpan banyak data dengan kedaluwarsa yang lama, karena berisiko melebihi kuota memori Anda dan potensial menyebabkan masalah yang dapat merusak seluruh pengalaman Anda.
    • Selalu menghapus secara eksplisit item yang tidak diperlukan atau atur batas waktu item pendek.
    • Secara umum, Anda harus menggunakan penghapusan eksplisit untuk melepaskan memori dan kedaluwarsa item sebagai mekanisme keamanan untuk mencegah item yang tidak digunakan menempati memori untuk jangka waktu yang lama.
  • Hanya menyimpan nilai yang diperlukan di memori.

    Sebagai contoh, untuk pengalaman rumah lelang, Anda hanya perlu memelihara tawaran tertinggi.Anda dapat menggunakan MemoryStoreSortedMap:UpdateAsync() pada satu kunci untuk menyimpan tawaran tertinggi daripada menyimpan semua tawaran di struktur data Anda.

  • Gunakan penurunan eksponensial untuk membantu tetap di bawah batas permintaan API.

    Sebagai contoh, jika Anda menerima DataUpdateConflict, Anda mungkin mencoba kembali setelah dua detik, lalu empat, delapan, dll.daripada terus-menerus mengirim permintaan ke MemoryStoreService untuk mendapatkan respons yang benar.

  • Membagi struktur data raksasa menjadi beberapa yang lebih kecil dengan pemecahan .

    Seringkali lebih mudah untuk mengelola data di struktur yang lebih kecil daripada menyimpan semuanya dalam satu struktur data besar.Pendekatan ini juga dapat membantu menghindari batas penggunaan dan tingkat.Sebagai contoh, jika Anda memiliki peta yang disortir yang menggunakan pr prefik untuk kuncinya, pertimbangkan untuk memisahkan setiap pr prefik ke dalam peta terpisah.Untuk pengalaman yang sangat populer, Anda bahkan dapat memisahkan pengguna menjadi beberapa peta berdasarkan digit terakhir dari ID pengguna mereka.

  • Kompres nilai yang disimpan.

    Sebagai contoh, pertimbangkan menggunakan algoritma LZW untuk mengurangi ukuran nilai yang disimpan.

Dapat Diamati

Dashboard Observabilitas memberikan wawasan dan analisis untuk memantau dan memecahkan masalah penggunaan penyimpanan memori Anda.Dengan grafik pembaruan waktu nyata tentang berbagai aspek penggunaan memori dan permintaan API, Anda dapat melacak pola penggunaan memori pengalaman Anda, melihat kuota yang ditugaskan saat ini, memantau status API, dan mengidentifikasi masalah potensial untuk optimisasi kinerja.

Tabel berikut daftar dan menjelaskan semua kode status balasan API yang tersedia di Request Count by Status dan Requests by API x Status bagan.Untuk informasi lebih lanjut tentang cara menyelesaikan kesalahan ini, lihat Memecahkan Masalah.Untuk kuota atau batas tertentu yang terkait dengan kesalahan, lihat Batas dan Kuota.

Kode kodeDeskripsi
KeberhasilanBerhasil.
Memori Struktur Data Lebih dari BatasMelebihi batas ukuran memori struktur data (100MB).
Konflik DataUpdateKonflik karena update bersamaan.
Akses DitolakTidak berwenang untuk mengakses data pengalaman. Permintaan ini tidak mengkonsumsi unit permintaan atau menggunakan kuota.
Kesalahan internalKesalahan internal.
Permintaan Tidak ValidPermintaan tidak memiliki informasi yang diperlukan atau memiliki informasi yang tidak valid.
Item Struktur Data di Atas BatasMelebihi batas jumlah item struktur data (1M).
Tidak ada Item DitemukanTidak ada item yang ditemukan di MemoryStoreQueue:ReadAsync() atau MemoryStoreSortedMap:UpdateAsync() . ReadAsync() polling setiap 2 detik dan mengembalikan kode status ini sampai menemukan item di antrian.
Permintaan Struktur Data di LimitasiMelebihi batas permintaan tingkat struktur data (100.000 permintaan per menit).
Permintaan Pembagian Lebih dari BatasMelebihi batas permintaan unit pembagian.
Permintaan Total Lebih dari BatasMelebihi batas unit permintaan tingkat alam semesta.
TotalMemori Lebih BatasMelebihi kuota memori tingkat alam semesta.
ItemValueSizeTerlalu BesarUkuran nilai melebihi batas (32KB).

Tabel berikut daftar kode negara dari sisi klien, yang saat ini tidak tersedia di Dashboard Observabilitas.

Kode kodeDeskripsi
Kesalahan internalKesalahan internal.
Tempat Tidak DipublikasikanAnda harus mempublikasikan tempat ini untuk menggunakan MemoryStoreService.
Akses Klien Tidak ValidLayanan Penyimpanan Memori harus dipanggil dari server.
Waktu Kedaluwarsa Tidak ValidWaktu bidang 'kadaluarsa' harus berada di antara 0 dan 3,888,000.
Permintaan Tidak ValidTak dapat mengkonversi nilai ke json.
Permintaan Tidak ValidTak dapat mengonversi sortKey ke angka atau string yang valid.
Transformasi Callback GagalGagal memanggil fungsi panggilan transformasi.
Permintaan DibatasiPermintaan Memori Terbaru terkena satu atau lebih batas.
Konflik PembaruanMelebihi batas maksimum jumlah percobaan ulang.

Pemecahan Masalah

Tabel berikut daftar dan menjelaskan solusi yang direkomendasikan untuk setiap kode status balasan:

KesalahanOpsi pemecahan masalah
Permintaan Struktur Data Terlampau Batas / Permintaan Partisi Terlampau Batas
  • Tambahkan cache lokal dengan menyimpan informasi ke variabel lain dan memeriksa ulang setelah rentang waktu tertentu, seperti 30 detik.:
  • Gunakan bagan Request Count by Status untuk memverifikasi bahwa Anda menerima lebih banyak respons Sukses daripada NoItemFounds .Membatasi jumlah kali Anda memukul MemoryStoreService dengan permintaan gagal.:
  • Laksanakan penundaan singkat antara permintaan.:
  • Ikuti praktik terbaik , termasuk:
    • Memecahkan struktur data Anda jika Anda menerima jumlah besar DataStructureRequestsOverLimit / PartitionRequestsOverLimit respons.:
    • Terapkan penundaan eksponensial untuk menemukan tingkat permintaan yang wajar untuk dikirim.
Permintaan Total Lebih dari Batas
Item Struktur Data di Atas Batas
Memori Struktur Data Lebih dari Batas
TotalMemori Lebih Batas
Konflik DataUpdate
  • Terapkan penundaan singkat antara permintaan untuk menghindari banyak permintaan yang memperbarui kunci yang sama pada saat yang sama.:
  • Untuk peta diurutkan, gunakan fungsi panggil balik pada metode MemoryStoreSortedMap:UpdateAsync() untuk membatalkan permintaan setelah jumlah tertentu upaya, seperti yang ditunjukkan contoh kode berikut:
  • 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")
  • Selidiki untuk melihat apakah Anda memanggil MemoryStoreService secara efisien untuk menghindari konflik.Idealnya, Anda tidak harus mengirim terlalu banyak permintaan.:
  • Hapus item secara konsisten setelah dibaca menggunakan metode MemoryStoreQueue:RemoveAsync() untuk antrian dan MemoryStoreSortedMap:RemoveAsync() untuk peta yang disortir.
Kesalahan internal
  • Periksa halaman status Roblox.
  • Ajukan laporan bug yang menggambarkan masalah dengan ID Universe pengalaman Anda.
Permintaan Tidak Valid
  • Pastikan bahwa Anda menyertakan parameter yang benar dan valid dalam permintaan Anda. Contoh parameter yang tidak valid termasuk:
    • Sebuah string kosong
    • Sebuah string yang melebihi batas panjang
ItemValueSizeTerlalu Besar
  • Hancurkan atau bagi nilai item menjadi beberapa kunci.
    • Untuk mengatur kunci tergrup, urutkan secara alfabetik dengan menambahkan prefix ke unit.
  • Mengkodekan atau mengompresi nilai yang disimpan.

Tes dan debug di Studio

Data di MemoryStoreService diisolasi antara Studio dan produksi, jadi mengubah data di Studio tidak memengaruhi perilaku produksi.Ini berarti bahwa panggilan API Anda dari Studio tidak mengakses data produksi, memungkinkan Anda untuk menguji penyimpanan memori dan fitur baru dengan aman sebelum masuk ke produksi.

Pengujian studio memiliki batas dan kuota yang sama seperti produksi.Untuk kuota yang dihitung berdasarkan jumlah pengguna, kuota yang dihasilkan bisa sangat kecil karena Anda adalah satu-satunya pengguna untuk pengujian Studio.Saat menguji dari Studio, Anda juga mungkin memperhatikan latensi sedikit lebih tinggi dan tingkat kesalahan yang lebih tinggi dibandingkan dengan penggunaan di produksi karena beberapa pemeriksaan tambahan yang dilakukan untuk memverifikasi akses dan izin.

Untuk informasi tentang cara mem debug penyimpanan memori pada pengalaman langsung atau saat menguji di studio, gunakan Konsol Pengembang.