Struktur data sortir peta dari toko memori memungkinkan Anda untuk menyimpan data-data dalam memori sering seperti pasangan nilai kunci dengan kunci sorting opcional dan menjaga tatanan data dalam memori yang dibasarkan pada kunci dan kunci. Berbeda dengan antrian, tata letak tombol masuk ke peta tidak menentukan tata let
Membatasi
Selain batas ukuran struktur data , mapa sorting memiliki batas ukuran kunci 128 karakter, batas ukuran nilai 32 KB, dan batas ukuran sortasi 128 karakter.
Jika Anda perlu menyimpan data yang melebihi batas ini untuk pengalaman Anda, Anda dapat mengadopsi teknik pembagian untuk membagi dan mendistribusikannya melalui pr premis kunci ke berbagai struktur data. Toko memori pembagian juga dapat membantu meningkatkan skalabilitas sistem Anda.
Mendapatkan Peta Terurut
Untuk mendapatkan peta yang diurutkan, panggil Class.MemoryStoreService:GetSortedMap() dengan nama nama yang ingin Anda definisikan untuk peta. Nama adalah global dalam pengalaman, jadi Anda dapat mengakses peta yang diurutkan di setiap script menggunakan nama.
Mendapatkan Peta Terurut
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
Setelah Anda mendapatkan peta yang diurutkan, panggil salah satu dari fungsi berikut untuk membaca atau menulis data di dalamnya:
Fungsi | Tindakan |
---|---|
MemoryStoreSortedMap:SetAsync() | Tambahkan kunci baru atau tulis ulang nilai dan/atau sortir kunci jika kunci sudah ada. |
MemoryStoreSortedMap:GetAsync() | Baca kunci tertentu. |
MemoryStoreSortedMap:GetRangeAsync() | Baca semua kunci yang ada atau rentang khusus dari mereka. |
MemoryStoreSortedMap:UpdateAsync() | Update nilai kunci dan/atau sort kunci setelah mengambilnya dari sortiran peta. |
MemoryStoreSortedMap:RemoveAsync() | Hapus kunci dari map yang diurutkan. |
Menambahkan atau Menulis Ulang Data
Untuk menambahkan kunci baru atau menulis ulang nilai atau sort key sebuah key di map sort, panggil MemoryStoreSortedMap:SetAsync() dengan kunci nama , nilai value Dalam urutan penyortiran kunci Anda, kunci sort menempati prioritas atas unit. Misalnya, ketika sorting dalam urutan menurut asas, kunci sort numerik pertama-tama, diikuti oleh kunci sort string, diikuti oleh item dengan tidak ada kunci sort. Semua item dengan kunci sort menurut asas diur
Contoh beberapa data diurutkan dalam urutan naik -
{Key: "player1", Value: someValue1, SortKey: -1}{Key: "player2", Value: someValue2, SortKey: 0}{Key: "player4", Value: someValue3, SortKey: 1}{Key: "player5", Value: someValue4, SortKey: 1}{Key: "player3", Value: someValue5, SortKey: 3.14}{Key: "player6", Value: someValue6, SortKey: "someString"}{Key: "player0", Value: someValue7}{Key: "player7", Value: someValue8}
Catat bagaimana player0 mengurutkan semua kunci dengan unitsort. player6 mengurutkan semua kunci dengan unitsort numerik. player4 dan 1> player51> memiliki unitsort yang sama, jadi mereka diurutkan dalam urutan menurut unit.
Menambahkan Data ke Peta Terurut
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
Mendapatkan Data
Anda dapat mengambil nilai data dan mengurutkan kunci yang terkait dengan kunci tertentu atau mendapatkan beberapa nilai dan mengurutkan kunci untuk kunci dalam rentang.
Mendapatkan Data dengan Satu Kunci
Untuk mendapatkan nilai dan mengurutkan kunci yang terkait dengan satu kunci dari map yang diurutkan, panggil MemoryStoreSortedMap:GetAsync() dengan kunci nama .
Mendapatkan Kunci Tertentu dari Peta yang Disortir
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, 3.14152)
end)
if setSuccess then
print("Set succeeded.")
end
local item
local getSuccess, getError = pcall(function()
item = sortedMap:GetAsync("User_1234")
end)
if getSuccess then
print(item)
else
warn(getError)
end
Mendapatkan Data dengan Beberapa Kunci
Untuk mendapatkan data untuk beberapa kunci dari map sort sebagai satu operasi, panggil MemoryStoreSortedMap:GetRangeAsync() . Fungsi ini mengumpulkan semua
Mendapatkan Range of Keys dari Map Sorted
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local lowerBound = {}
lowerBound["key"] = "10"
lowerBound["sortKey"] = 100
local upperBound = {}
upperBound["key"] = "50"
upperBound["sortKey"] = 500
-- Dapatkan hingga 20 item dimulai dari awal
local getSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(
Enum.SortDirection.Ascending, 20, lowerBound, upperBound)
end)
if getSuccess then
for _, item in items do
print(item.key)
print(item.sortKey)
end
end
Mengaktualisasi Data
Untuk mengambil nilai dan mengurutkan kunci dari kunci dari peta sort dan menyimpannya, panggil MemoryStoreSortedMap:UpdateAsync() dengan kunci nama , fungsi panggilan untuk menyimpan nilai dan mengurutkan kunci untuk unitini, dan waktu kedaluwarsa dalam detik. Wakt
Untuk kebanyakan pengalaman, beberapa server dapat memperbarui kunci yang sama secara bersamaan dan mengubah nilainya. Sebagai UpdateAsync() yang selalu mengubah nilai terbaru sebelum diperbarui, Anda harus menggunakannya untuk membaca nilai terbaru sebagai input untuk fungsi panggilan Anda.
Misalnya, contoh kode berikut menghasilkan skor di papan peringkat untuk pemain dalam permainan. Skor dihitung sebagai kill / kematian. UpdateAsync() memastikan bahwa kill dan kematian diperbarui untuk nilai terbaru bahkan jika lebih dari satu server game mengaktifkan item yang sama secara bersamaan. K
Mengaktualisasi skor papan peringkat untuk pemain di Peta Terurut
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("Leaderboard")
local function updateLeaderboard(itemKey, killsToAdd, deathsToAdd)
local success, newStats, newScore = pcall(function()
return sortedMap:UpdateAsync(itemKey, function(playerStats, playerScore)
playerStats = playerStats or { kills = 0, deaths = 0 }
playerStats.kills += killsToAdd
playerStats.deaths += deathsToAdd
if playerStats then
-- `playerScore` adalah sortKey yang digunakan untuk mengurutkan item di peta
playerScore = playerStats.kills / math.max(playerStats.deaths, 1)
return playerStats, playerScore
end
return nil
end, 30)
end)
if success then
print(newStats)
print(newScore)
end
end
Latensi untuk UpdateAsync() mirip dengan GetAsync() dan SetAsync() kecuali jika ada konten.
Ketika kontensi terjadi, sistem secara otomatis mencoba kembali operasi sampai salah satu dari tiga ini terjadi: operasi berhasil, fungsi panggilan kembali bernilai nol, atau jumlah maksimum retries dicapai. Jika sistem mencapai jumlah retries maksimum, itu menunjukkan konflik.
Menghapus Data
Anda dapat menggunakan MemoryStoreSortedMap:RemoveAsync() untuk kedua menghapus satu kunci dari map sortir dan menghapus semua data di memori sortir map.
Menghapus Kunci
Untuk menghapus kunci dari map yang diurutkan, panggil MemoryStoreSortedMap:RemoveAsync() dengan kunci nama .
Hapus Kunci dari Peta Terurut
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
local setSuccess, _ = pcall(function()
return sortedMap:SetAsync("User_1234", 1000, 30, "someStringSortKey")
end)
if setSuccess then
print("Set succeeded.")
end
local removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync("User_1234")
end)
if not removeSuccess then
warn(removeError)
end
Menghapus Semua Data
Untuk menghapus memori dalam daftar peta terurut, daftarkan semua kunci Anda dengan MemoryStoreSortedMap:GetRangeAsync() , lalu hapus mereka dengan MemoryStoreSortedMap:RemoveAsync() .
Hapus Memori di Peta Terurut
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Batas bawah nol awal dimulai dari item pertama
local exclusiveLowerBound = nil
while true do
-- Dapatkan hingga seratus item dimulai dari batas bawah saat ini
local getRangeSuccess, items = pcall(function()
return sortedMap:GetRangeAsync(Enum.SortDirection.Ascending, 100, exclusiveLowerBound)
end)
if getRangeSuccess then
local removeSuccess = true
local removeError = nil
for _, item in items do
removeSuccess, removeError = pcall(function()
sortedMap:RemoveAsync(item.key)
end)
end
-- Jika ada kesalahan menghapus item, coba lagi dengan batas bawah eksklusif yang sama
if not removeSuccess then
warn(removeError)
-- Jika rentang kurang dari seratus item, batas peta dicapai
elseif #items < 100 then
break
else
-- Kunci terakhir yang diambil adalah batas bawah eksklusif untuk iterasi berikutnya
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end