Tergantung pada ketikstruktur data, MemoryStoreService memaksakan batasan pada memori dan jumlah item dalam struktur data.Semua struktur data juga dibatasi oleh batas permintaan per-partisi global.
Setiap pengalaman Roblox memiliki Dashboard Observabilitas Toko Memori, yang berisi serangkaian grafik yang dapat Anda gunakan untuk memantau penggunaan toko memori.
Peta dan antrian diurutkan
Peta dan antrian diurutkan keduanya memiliki batasan pada jumlah maksimum item dan memori total maksimum.Selain itu, item di salah satu struktur data ini selalu berada di satu partisi.Setiap permintaan ke salah satu struktur data tersebut adalah permintaan ke partisi yang sama.
Ketika peta atau antrian yang disortir mencapai batas item atau memori, tindakan terbaik adalah menghapus item yang tidak diperlukan secara manual atau dengan menambahkan kebijakan kedaluwarsa untuk item.Alternatifnya, jika hanya batas memori yang menyebabkan penurunan, Anda dapat mencoba mengurangi ukuran item Anda dengan menghapus informasi yang tidak diperlukan dari kunci dan nilai Anda.
Jika Anda membutuhkan semua item Anda atau mengalami penurunan karena permintaan melaluiput, satu-satunya solusi adalah pemecahan potongan.
Pemecahan
Pemecahan adalah proses penyimpanan serangkaian data terkait di beberapa struktur data.Dengan kata lain, ini berarti mengambil struktur data berjalan tinggi yang ada dan menggantinya dengan beberapa yang lebih kecil yang bersama-sama berisi set data yang sama seperti aslinya.
Tantangan kunci untuk pemecahan adalah menemukan cara untuk menyebarkan data di berbagai struktur data dengan cara yang mempertahankan fungsi yang sama dengan aslinya.
Memecah peta yang disortir
Untuk memecahkan peta yang disortir, pertimbangkan untuk membagi data Anda menjadi subbagian alfabetik dengan rentang karakter.Sebagai contoh, anggaplah Anda hanya memiliki kunci dengan huruf pertama dari A-Z, dan Anda percaya empat peta terurut sudah cukup untuk kasus penggunaan saat ini dan pertumbuhan masa depan:
- Peta pertama dapat mencakup A-G, kedua H-N, ketiga O-T, dan keempat U-Z.
- Untuk menyisipkan atau menarik kembali item, gunakan peta yang sesuai berdasarkan karakter awal item.
Memecahkan Peta Terurut
-- Memulai Layanan MemoriStore
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Buat bucket Peta Terurut Anda
local sm_AtoG = MemoryStoreService:GetSortedMap("AtoG")
local sm_HtoM = MemoryStoreService:GetSortedMap("HtoM")
local sm_NtoT = MemoryStoreService:GetSortedMap("NtoT")
local sm_UtoZ = MemoryStoreService:GetSortedMap("UtoZ")
-- Fungsi pembantu untuk mengambil bucket yang benar dari Kunci Item
local function getSortedMapBucket(itemKey)
if (itemKey >= "a" and itemKey < "h") then
return sm_AtoG
elseif (itemKey < "n") then
return sm_HtoM
elseif (itemKey < "u") then
return sm_NtoT
else
return sm_UtoZ
end
end
-- Inisialisasi nama pemain dengan nilai default 0
for _, player in game:GetService("Players"):GetPlayers() do
local bucket = getSortedMapBucket(player)
bucket:SetAsync(player, 0, 600)
end
-- Ambil nilai pemain
local player = "myPlayer"
local bucket = getSortedMapBucket(player)
local playerScore = bucket:GetAsync(player)
print(playerScore)
Memecahkan antrian
Memecahkan antrian lebih rumit daripada memecahkan peta yang disortir.Meskipun Anda ingin menyebarkan lalu lintas permintaan melintasi beberapa antrian, menambahkan, membaca, dan menghapus hanya pernah terjadi di depan atau belakang antrian.
Satu solusi adalah menggunakan antrian berputar, yang berarti membuat beberapa antrian dan berputar di antara mereka saat Anda menambahkan atau membaca item:
Buat beberapa antrian dan tambahkan ke array.
Buat dua penunjuk lokal. Satu mewakili antrian yang ingin Anda baca dan hapus item dari. Yang lain mewakili antrian yang ingin Anda tambahkan item ke:
- Untuk operasi baca, hitung jumlah item yang Anda butuhkan dari setiap antrian, serta tempat untuk memindahkan pointer baca ke.
- Untuk menghapus operasi, berikan ID dari baca ke setiap antrian.
- Untuk menambah operasi, tambahkan ke antrian di add pointer dan meningkatkan pointer.
Memecahkan Antrian
-- Memulai Layanan MemoriStore
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Buat Antrian Anda
local q1 = MemoryStoreService:GetQueue("q1")
local q2 = MemoryStoreService:GetQueue("q2")
local q3 = MemoryStoreService:GetQueue("q3")
local q4 = MemoryStoreService:GetQueue("q4")
-- Tempatkan Antrian di Array
local queueArr = { q1, q2, q3, q4 }
-- Buat dua penunjuk yang mewakili indeks baca dan tambahkan antrian
local readIndex = 1
local addIndex = 1
-- Buat fungsi lokal yang memperbarui indeks sesuai
local function rotateIndex(index, n)
return (index + n - 1) % 4 + 1
end
-- Buat fungsi lokal yang membaca n item dari antrian
local function readFromQueue(count, allOrNothing, waitTimeout)
local endIndex = count % 4
local countPerQueue = count // 4
local items = {}
local ids = {}
-- lingkaran melalui setiap antrian
for i = 1, 4, 1 do
-- putuskan apakah antrian ini akan membaca item tambahan
local diff = i - readIndex
if diff < 0 then
diff += 4
end
local queue = queueArr[i]
-- membaca item dari setiap antrian
-- +1 item jika cocok dengan kriteria baca ekstra
if diff < endIndex then
items[i], ids[i] = queue:ReadAsync(countPerQueue + 1, allOrNothing,waitTimeout)
else
items[i], ids[i] = queue:ReadAsync(countPerQueue, allOrNothing,waitTimeout)
end
end
readIndex = rotateIndex(readIndex, count)
return items, ids
end
-- Buat fungsi lokal yang menghapus n item dari antrian
local function removeFromQueue(ids)
for i = 1, 4, 1 do
local queue = queueArr[readIndex]
queue:RemoveAsync(ids[i])
end
end
-- Buat fungsi lokal yang menambahkan item ke antrian
local function addToQueue(itemKey, expiration, priority)
local queue = queueArr[readIndex]
queue:AddAsync(itemKey, expiration, priority)
addIndex = rotateIndex(addIndex, 1)
end
-- Tulis beberapa kode!
for _, player in game:GetService("Players"):GetPlayers() do
addToQueue(player, 600, 0)
end
local players, ids = readFromQueue(20, true, -1)
removeFromQueue(ids)
Peta hash
Peta hash tidak memiliki batas memori atau jumlah item individu dan secara otomatis dipatahkan, tetapi Anda masih dapat mengalami penurunan jika menggunakannya dengan buruk.
Sebagai contoh, pertimbangkan pengalaman dengan peta hash data permainan, disimpan sebagai nilai kunci tunggal bernama metadata .Jika metadata ini berisi objek terkait dengan informasi seperti ID tempat, jumlah pemain, dan banyak lagi, setiap kali metadata dibutuhkan, Anda tidak punya pilihan selain memanggil GetAsync("metadata") dan mengambil seluruh objek.Dalam kasus ini, semua permintaan pergi ke satu kunci dan karena itu satu partisi.
Daripada menyimpan semua metadata sebagai objek tunggal, terpisah, lebih baik untuk menyimpan setiap bidang sebagai kunci sendiri sehingga peta hash dapat memanfaatkan pemecahan otomatis.Jika Anda membutuhkan pemisahan antara metadata dan sisa peta hash, tambahkan prefik nama (misalnya metadata_user_count daripada hanya user_count ).