Tergantung pada ketikstruktur data, MemoryStoreService menegakkan batas pada memori dan jumlah item dalam struktur data. Semua struktur data juga dibatasi oleh batas permintaan per-partisi global.
Setiap pengalaman Roblox memiliki Dashboard Visibilitas Toko Memori, yang termasuk set grafik yang dapat Anda gunakan untuk memantau penggunaan toko memori.
Peta Terurut dan Antrian
Peta dan antrian yang disortir keduanya memiliki batasan pada jumlah maksimum item dan memori maksimum. Selain itu, item dalam salah satu struktur data ini selalu berada di satu partisi. Setiap permintaan ke salah satu struktur data ini selalu merupakan permintaan ke partisi tunggal.
Ketika peta atau antrian tersortir mencapai batas item atau memori mereka, langkah terbaik adalah menghapus item yang tidak perlu secara manual atau dengan menambahkan kebijakan kedaluwarsa untuk item. Alternatifnya, jika hanya batas memori yang menyebabkan kelambatan, Anda dapat mencoba untuk mengurangi ukuran item dengan menghapus informasi yang tidak perlu dari kunci dan nilai Anda.
Jika Anda memerlukan semua item Anda atau mengalami kelambatan pengiriman permintaan karena permintaan melaluiput, satu-satunya solusi adalah memotong.
Pembagian
Pembagian adalah proses menyimpan set data terkait di beberapa struktur data. Dengan kata lain, itu berarti mengambil data set yang sudah ada dan menggantikannya dengan beberapa, lebih kecil yang bersama-sama berisi set data yang sama seperti yang asli.
Tantangan kunci untuk menghancurkan adalah menemukan cara untuk menyebarkan data ke beberapa struktur data dalam cara yang menyimpan fungsionalitas yang sama seperti yang asli.
Membagi Peta yang Diurutkan
Untuk membagi peta yang diurutkan, pertimbangkan untuk membagi data Anda menjadi subjek alfanumerik dengan rentang karakter. Misalnya, asumsikan bahwa Anda hanya memiliki kunci dengan huruf pertama dari A-Z, dan Anda percaya bahwa empat subjek peta telah cukup untuk kasus penggunaan Anda saat ini dan pertumbuhan masa depan:
- Peta pertama dapat menutupi A-G, kedua H-N, ketiga O-T, dan keempat U-Z.
- Untuk menambahkan atau mengambil item, gunakan peta yang sesuai berdasarkan karakter awal item.
Membagi Peta yang Diurutkan
-- Menginisialisasi Layanan Penyimpanan Memori
local MemoryStoreService = game:GetService("MemoryStoreService")
-- Buat daftar map 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 ember yang benar dari Item Key
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
-- Mengizinkan 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)
Membagi Antrian
Menyebarkan antrian lebih mudah daripada menyebarkan peta terurut. Meskipun Anda ingin menyebarkan jumlah permintaan melalui beberapa antrian, menambahkan, membaca, dan menghapus hanya pernah terjadi di depan atau belakang antrian.
Satu solusi adalah menggunakan antrian berputar, yang berarti menciptakan beberapa antrian dan berputar di antara mereka saat Anda menambahkan atau membaca item:
Buat beberapa antrian dan tambahkan mereka ke array.
Buat dua poin lokal. Salah 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 di mana untuk menempatkan poin baca.
- Untuk menghapus operasi, sampaikan ID dari read ke setiap antrian.
- Untuk menambahkan operasi, tambahkan ke antrian di poin tambahkan dan tambahkan poin.
Membagi Antrian
-- Menginisialisasi Layanan Penyimpanan Memori
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 poin representatif indeks baca dan tambahkan antrian
local readIndex = 1
local addIndex = 1
-- Buat fungsi lokal yang memperbarui indeks dengan benar
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 = {}
-- berlari melalui setiap antrian
for i = 1, 4, 1 do
-- determinasikan 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 memenuhi 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 tunggal dan secara otomatis dibagi, tetapi Anda masih dapat menghadapi pengalaman membatasi jika Anda menggunakannya dengan buruk.
Misalnya, pertimbangkan pengalaman dengan peta hasil game, yang disimpan sebagai nilai satu kunci bernama metadata. Jika metadata ini berisi objek berantai dengan informasi seperti ID lokasi, jumlah pemain, dan banyak lagi, setiap kali metadata diperlukan, Anda tidak punya pilihan selain memanggil GetAsync("
Alih-alih menyimpan semua metadata sebagai objek tunggal, berantai, yang lebih baik adalah menyimpan setiap field sebagai kunci masing-masing sehingga peta hash dapat mengambil keuntungan dari pembagian otomatis. Jika Anda memerlukan pemisahan antara metadata dan sisa peta hash, tambahkan naming prefix (juga. metadata_user_count).