Cấu trúc dữ liệu bản đồ sắp xếp của bộ nhớ cho phép bạn lưu trữ dữ liệu thường xuyên trong máy chủ bằng cặp giá trị chìa khóa với một chìa khóa sort chọn lựa và duy trì một lượng tr
Giới hạn
Ngoài các giới hạn quy mô kích thước dữ liệu , các bản đồ sắp xếp có một giới hạn quy mô lớn lượng 128 ký tự, một giới hạn quy mô giá trị 32 KB và một giới hạn quy mô chìa khóa 128 ký tự.
Nếu bạn cần lưu trữ dữ liệu vượt qua giới hạn này cho trải nghiệm của bạn, bạn có thể chấp nhận công nghệ chia cắt để chia và phân phối chúng thông qua tiết kiệm chìa khóa vào các cấu hình dữ liệu nhiều. Các cửa hàng lưu trữ dữ liệu cũng có thể giúp tăng tốc đ
Lấy bản đồ đã sắp xếp
Để có một bản đồ sắp xếp, gọi MemoryStoreService:GetSortedMap() với một tên bạn muốn định cho bản đồ. Tên là toàn cầu trong trải nghiệm, vì vậy bạn có thể truy cập cùng một bản đồ sắp xếp ở bất kỳ màn hình nào sử dụng tên.
Lấy bản đồ đã sắp xếp
local MemoryStoreService = game:GetService("MemoryStoreService")local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
Sau khi bạn có một bản đồ sắp xếp, gọi bất kỳ trong số các chức năng sau đây để đọc hoặc viết dữ liệu vào nó:
Hàm | Hành động |
---|---|
MemoryStoreSortedMap:SetAsync() | Thêm một chìa khóa mới hoặc đổi/trượt giá trị và/hoặc sắp xếp chìa khóa nếu chìa khóa đã tồn tại. |
MemoryStoreSortedMap:GetAsync() | Đọc một chìa khóa cụ thể. |
MemoryStoreSortedMap:GetRangeAsync() | Đọc tất cả các khóa hiện có hoặc một loạt các khóa cụ thể. |
MemoryStoreSortedMap:UpdateAsync() | Cập nhật giá trị của một key và/hoặc sort key sau khi lấy nó từ bản map sort. |
MemoryStoreSortedMap:RemoveAsync() | Loại bỏ một key khỏi bản sort map. |
Thêm hoặc Đổi dữ liệu
Để thêm một chìa khóa mới hoặc đổi giá trị hoặc sắp xếp giá trị của một chìa khóa trong bảng xếp hạng, gọi Class.MemoryStoreS
Trong thứ tự sắp xếp của các chìa khóa của bạn, một chìa khóa sắp xếp ưu tiên hơn một chìa khóa. Ví dụ, khi sắp xếp theo thứ tự tăng dần, các chìa khóa sắ
Ví dụ về một số dữ liệu sắp xếp theo thứ tự tăng dần -
{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}
Lưu ý là player0 sắp xếp sau tất cả các chìa khóa bằng một chìa khóa sắp xếp. player6 sắp xếp sau tất cả các chìa khóa bằng một chìa khóa sắp xếp số. player4 và 1> player5
Thêm Dữ Liệu vào Bản Đồ Sắp Xếp
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
Lấy dữ liệu
Bạn có thể nhận giá trị dữ liệu và sắp xếp chìa khóa được liên kết với một chìa khóa cụ thể hoặc nhận nhiều giá trị và sắp xếp chìa khóa cho các kết quả trong một phạm vi.
Lấy dữ liệu với một chìa khóa
Để nhận một giá trị và sắp xếp chìa khóa liên quan đến một chìa khóa từ bảng xếp hạng, gọi MemoryStoreSortedMap:GetAsync() với chìa khóa tên .
Lấy một Chìa khóa cụ thể từ một Bản đồ sắp xếp
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
Lấy dữ liệu với nhiều chìa khóa
Để nhận dữ liệu cho nhiều chìa khóa từ bản đồ sắp xếp như một mệnh lệnh duy nhất, gọi
Nhận một loạt các nút từ bản đồ sắp xếp
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
-- Lấy tối đa 20 vật phẩm khi bắt đầu
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
Cập nhật dữ liệu
Để lấy giá trị và sắp xếp chìa khóa của một chìa khóa từ một bản thống kê và cập nhật nó, gọi MemoryStoreSortedMap:UpdateAsync() với key tên , một hàm call để cập nhật giá
Đối với hầu hết các trải nghiệm, nhiều máy chủ có thể cập nhật cùng một chìa khóa và thay đổi giá trị. Khi UpdateAsync() luôn luôn điều chỉnh giá trị mới nhất trước khi cập nhật, bạn nên sử dụng nó để đọc giá trị mớ
Ví dụ, mẫu mã sau đây cập nhật điểm số trong bảng xếp hạng cho một người chơi trong một trò chơi. Điểm số được tính như số lần giết / số lần chết. UpdateAsync() đảm b
Cập nhật điểm của bảng xếp hạng cho một người chơi trong bản đồ sắp xếp
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` là chìa khóa loại được sử dụng để sắp xếp các mục trên bản đồ
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
Thời gian trễ cho UpdateAsync() giống như GetAsync() và SetAsync() trừ khi có chứa đựng.
Khi xảy ra điều kiện ngăn chặn, hệ thống sẽ tự động thử lại hoạt động cho đến khi một trong ba này xảy ra: hoạt động thành công, hàm chuỗi trả về nil hoặc số lần thử tối đa đã đạt được. Nếu hệ thống đạt đến số lần thử tối đa, nó sẽ trở lại một cuộc xung độ
Loại bỏ dữ liệu
Bạn có thể sử dụng MemoryStoreSortedMap:RemoveAsync() cho cả hai việc xóa một chìa khóa từ bản đồ sắp xếp và xóa tất cả các dữ liệu trong bản đồ lưu trữ sắp xếp.
Loại bỏ một Chìa khóa
Để xóa một chìa khóa khỏi bản đồ sắp xếp, hãy gọi MemoryStoreSortedMap:RemoveAsync() với một chìa khóa tên .
Loại bỏ một Chìa khóa từ Bản đồ Sắp xếp
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
Xóa tất cả dữ liệu
Để xóa bộ nhớ trong các bản đồ sắp xếp, liệt kí của tất cả các khóa với MemoryStoreSortedMap:GetRangeAsync() , sau đó loại bỏ chúng với MemoryStoreSortedMap:RemoveAsync() .
Xóa bộ nhớ trong một bản đồ sắp xếp
local MemoryStoreService = game:GetService("MemoryStoreService")
local sortedMap = MemoryStoreService:GetSortedMap("SortedMap1")
-- Giới hạn thấp nhất của nil bắt đầu từ vật phẩmđầu tiên
local exclusiveLowerBound = nil
while true do
-- Lấy tới một trăm mặt hàng bắt đầu từ giới hạn thấp hơn hiện tại
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
-- Nếu có một lỗi xóa mục, hãy thử lại với cùng một giới hạn thấp độc quyền
if not removeSuccess then
warn(removeError)
-- Nếu phạm vi dưới một trăm mục, kết thúc của bản đồ đã đạt được
elseif #items < 100 then
break
else
-- Chìa khóa cuối cùng đã lấy là giới hạn thấp nhất cho lần tái chế tiếp theo
exclusiveLowerBound = {}
exclusiveLowerBound["key"] = items[#items].key
exclusiveLowerBound["sortKey"] = items[#items].sortKey
end
end
end