Penyimpanan memori mengurutkan peta

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

Struktur data peta disortir data dari penyimpanan memori memungkinkan Anda untuk menyimpan data sering dalam memori sebagai pas kunci-nilai dengan kunci sortir opsional dan mempertahankan urutan tertentu berdasarkan kunci dan kunci sortir.Tidak seperti antrian, urutan kunci yang masuk ke peta tidak menentukan urutan pemrosesan, membuat peta terurut berguna untuk mengurutkan data organisasi berdasarkan basis untuk menerapkan entitas dalam pengalaman untuk berinteraksi seperti papan peringkat dan lelang server antar server.

Batasan

Selain batas ukuran struktur data , peta yang disortir memiliki batas ukuran kunci 128 karakter, batas ukuran nilai 32 KB, dan batas ukuran kunci sortir 128 karakter.

Jika Anda perlu menyimpan data yang melebihi batas ini untuk pengalaman Anda, Anda dapat mengadopsi teknik pembagian untuk membaginya dan mendistribusikannya melalui prefiks kunci ke beberapa struktur data.Toko memori pecahan juga dapat membantu meningkatkan skalabilitas sistem Anda.

Dapatkan peta yang disortir

Untuk mendapatkan peta yang disortir, panggil dengan nama yang ingin Anda definisikan untuk peta.Namanya global dalam pengalaman, sehingga Anda dapat mengakses peta yang disortir sama di setiap skrip menggunakan nama.

Mendapatkan Peta Terurut

local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")

Setelah Anda mendapatkan peta diurutkan, hubungi salah satu fungsi berikut untuk membaca atau menulis data di dalamnya:

FungsiTindakan
MemoryStoreSortedMap:SetAsync()Tambahkan kunci baru atau menulis ulang nilai dan/atau kunci sortir jika kunci sudah ada.
MemoryStoreSortedMap:GetAsync()Baca kunci tertentu.
MemoryStoreSortedMap:GetRangeAsync()Baca semua kunci yang ada atau rentang khusus dari mereka.
MemoryStoreSortedMap:UpdateAsync()Perbarui nilai kunci dan/atau kunci sortir setelah mengambilnya dari peta yang disortir.
MemoryStoreSortedMap:RemoveAsync()Hapus kunci dari peta yang disortir.

Tambahkan atau tulis ulang data

Untuk menambahkan kunci baru atau menghapus nilai atau kunci kunci dari kunci dalam peta terurut, panggil dengan kunci nama , nilai nya , waktu kedaluwarsa dalam detik dan kunci opsional .Memori secara otomatis membersihkan setelah kunci kedaluwarsa.Waktu kedaluwarsa maksimum adalah 3.888.000 detik (45 hari).uniturutan, jika disediakan, harus menjadi angka yang valid (integer atau titik apung) atau string.

Dalam urutan penyortiran kunci Anda, kunci penyortiran mengambil prioritas atas unit.Sebagai contoh, saat menyortir dalam urutan menaik, kunci penyortir numerik disortir pertama, diikuti oleh kunci penyortir string, diikuti oleh item tanpa unitpenyortir.Semua item dengan kunci sortir numerik disortir berdasarkan unitsortir, jika kunci sortir untuk dua item sama, mereka disortir berdasarkan unit.Demikian pula, semua item dengan kunci sortir string diurutkan berdasarkan kunci unit, jika kunci sortir untuk dua item sama, mereka diurutkan berdasarkan unit.Semua item tanpa kunci jenis diurutkan hanya dengan unit.

Contoh beberapa data disortir dalam urutan menaik -


{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}

Perhatikan bagaimana player0 urutkan setelah semua kunci dengan kunci unit.player6 urutkan setelah semua kunci dengan unitsortir numerik.player4 dan player5 memiliki unitjenis yang sama, sehingga mereka disortir dalam urutan menaik dengan 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

Dapatkan data

Anda dapat mendapatkan nilai data dan urutkan kunci yang terkait dengan kunci tertentu atau mendapatkan beberapa nilai dan urutkan kunci untuk kunci dalam jangkauan.

Dapatkan data dengan satu unit

Untuk mendapatkan nilai dan urutkan kunci yang terkait dengan satu kunci dari peta yang disortir, 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

Dapatkan data dengan beberapa kunci

Untuk mendapatkan data untuk beberapa kunci dari peta terurut sebagai satu operasi, panggil MemoryStoreSortedMap:GetRangeAsync() .Fungsi ini daftar semua kunci yang ada secara default, tetapi Anda dapat mengatur batas atas dan bawah untuk rentang kunci.Sebagai contoh, sampel kode berikut memperoleh hingga 20 item mulai dari awal peta yang disortir, dengan kunci lebih besar atau sama dengan 10 , kunci urutan lebih besar atau sama dengan 100 dan kunci kurang dari atau sama dengan 50 , kunci urutan kurang dari atau sama dengan 500 .

Mendapatkan Berbagai Kunci dari Peta yang Disortir

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 mulai 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

Mengupdate data

Untuk mengambil nilai dan kunci sortir dari kunci dari peta yang disortir dan memperbaruinya, panggil dengan kunci nama , fungsi panggil balik untuk memperbarui nilai dan kunci sortir untuk unitini, dan waktu kedaluwarsa dalam detik.Waktu kedaluwarsa maksimum adalah 3.888.000 detik (45 hari).

Untuk sebagian besar pengalaman, beberapa server dapat memperbarui kunci yang sama secara bersamaan dan mengubah nilainya.Sebagai UpdateAsync() selalu memodifikasi nilai terbaru sebelum diperbarui, Anda harus menggunakannya untuk membaca nilai terbaru sebagai input untuk fungsi callback Anda.

Sebagai contoh, kode sampel berikut memperbarui skor di papan peringkat untuk pemain dalam permainan.Skor dihitung sebagai bunuh / kematian. UpdateAsync() memastikan bahwa pembunuhan dan kematian diperbarui untuk nilai terbaru bahkan jika beberapa server game memperbarui item yang sama secara bersamaan.Pembunuhan dan kematian pemain secara monoton meningkatkan nilai dan karenanya hanya dapat meningkat dalam nilai dalam sesi.

Memperbarui 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 kunci sortir 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

Kelambatan untuk UpdateAsync() adalah mirip dengan GetAsync() dan SetAsync() kecuali ada persaingan.

Ketika kontes terjadi, sistem secara otomatis mencoba kembali operasi sampai salah satu dari tiga ini terjadi: operasi berhasil, fungsi panggil balasan kembali nil , atau jumlah maksimum upaya dicapai.Jika sistem mencapai jumlah maksimum upaya ulang, ia akan mengembalikan konflik.

Menghapus data

Anda dapat menggunakan MemoryStoreSortedMap:RemoveAsync() untuk menghapus satu kunci dari peta yang disortir dan menghapus semua data di memori store peta yang disortir.

Hapus unit

Untuk menghapus kunci dari peta yang disortir, panggil dengan nama kunci .

Hapus Kunci 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, "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

Hapus semua data

Untuk menghapus memori di 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 awal nol dimulai dari item pertama
local exclusiveLowerBound = nil
while true do
-- Dapatkan hingga seratus item mulai 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 jarak kurang dari seratus item, akhir peta tercapai
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