記憶體存儲

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

MemoryStoreService 是一種高速度和低延遲的數據服務,可提供快速的內存數據存取,可以從所有服務器在實時會作業中存取。 內存存檔 適用於快速變更的數據,不需要持續時間,因為它們是快速存取的,並且在最大

數據結構

而不是直接存取原始資料,記憶體存儲有三種原始資料結構在服務器間共享:排序地圖、排隊和哈希地圖。每種資料結構都適合某些使用案例:

  • 基於技能的匹配 - 保存用戶信息,例如技能等級,在共用 排隊 中服務器間,並使用大廳服務器來定期執行匹配。
  • 跨服務器交易和拍賣 - 啟用在不同服務器之間的通用交易,用戶可以在實時變更價格的物品,以及具有排序的鑰匙值對的地圖。
  • 全球排行榜 - 在排序地圖內的共用排行榜內儲存和更新用戶排名。
  • 共享道具欄 - 在共享的 哈希地圖 中,用戶可以與其他用戶一起使用道具欄項目。
  • 為持久資料建立儲存池 - 將持久資料同步到資料存取池中,以便在內存存取池中執行 哈希地圖 ,以提高您的體驗履約。

一般來說,如果您需要存取特定鍵的數據,請使用哈希表。 如果您需要要求數據的排序,請使用排序表。 如果您需要處理您的數據以特定順序,請使用排隊表。

限制和額度

為了維持可以擴展的系統性能和記憶體存取履約,記憶體有資料使用率對記憶體大小、API 請求和資料結構大小。

記憶體儲存有一個基於時間的驅逐政策,也稱為時間到 (TTL) 。項目在到期後會被驅逐,並且記憶體儲存的空間將被清除以便新增項目。當您達到記憶體上限時,所有的寫入請求都會失敗直到項目到期或您手動刪除它們。

記憶體大小限制

記憶體資源限制體驗可以消耗的總記憶量。它不是固定值。相反,它會隨著體驗中的用戶數量而改變。這是按照以下方式變化的: 64KB + 1KB * [用戶數量] 。記憶體資源對體驗層級而不是服務器等級進行變化。

當用戶加入體驗時,額外的記憶體資源可立即使用。當用戶離開體驗時,資源不會立即減少。有八天的追蹤期,之後資源將會重新評估至更低值。

您的體驗擊中記憶體容量上限時,任何增加記憶體容量的 API 請求都會失敗。減少或不變更記憶體容量的請求仍然成功。

使用 可視化 面板,您可以在實時檢視您的體驗內存大小 quota 的圖表。

API 請求限制

對於 API 請求限制,有 請求單位 額外資源可應用於所有 MemoryStoreService API 呼叫。資源是每分鐘 1000 + 100 * [number of concurrent users] 個要求單位。

大多數 API 呼叫只消耗一個要求單位,但有幾個例外:

請注意,請在體驗級別而不是服務器等級別上設定請求數量上限。這樣可以在服務器之間允許請求,並且不會超過總請求率。如果您超過總請求率,您將收到錯誤回應。

有了 可觀察性 功能,您可以在實時檢視您的體驗的請求單位額。

資料結構大小限制

對於單個排序的地圖或佇列,以下尺寸和項目數量限制適用:

  • 最大物品數量:1,000,000
  • 最大總尺寸 (包括排序地圖的鑰匙):100 MB

分區限制

請參閱 分區限制

最佳實踐

要保持您的記憶使用模式最佳,並避免擊中限制,請遵循這些最佳習慣:

  • 移除處理的項目。 一致地清除排隊中的閱取項目使用 MemoryStoreQueue:RemoveAsync() 方法為排隊清除 和 MemoryStoreSortedMap:RemoveAsync() 排序的地圖可以免費的資料結構。

  • 在添加資料時設定過期時間為最小時間框架。 雖然預設過期時間為 45 天,但設定最短的時間框架可以自動清理舊資料,以防止它們填滿您的記憶體使用率。

    • 不要存儲大量資料,因為它會導致超出您的記憶體資源,並可能導致潛在導致您的整個體驗中損壞。
    • 必須要明確刪除不需要的項目,或設定一個短項目的過期時間。
    • 一般來說,您應該使用明確的刪除來釋放記憶體和物品過期作為安全機制,以防止未使用的項目佔用記憶體,以及延長時間內未使用的項目。
  • 只保留必要值在記憶體中。

    舉例來說,對於拍賣屋體驗,您只需要維持最高價格。您可以使用 MemoryStoreQueue:UpdateAsync() 在一個鑰匙上來保持最高價格,而不是保持所有潛在的價格在您的資料結構中。

  • 使用 指數減法背包 來幫助您保持在 API 請求限制之下。

    舉例來說,如果您收到 DataUpdateConflict,您可以在兩秒後嘗試,然後在四,八,等等發送請求給 MemoryStoreService 以取得正確的回應。

  • 將巨大資料結構分割成 碎片

    管理資料通常比儲存在一個大的資料結構中更容易。這種方法可以幫助避免使用和僅率限制。例如,如果您有使用條件和僅率限制的排序圖,請考慮將每個條件分開到自己的排序圖。對於一個特別受歡迎的體驗,您甚至可以將用戶分成多個地圖,基於用戶的ID。

  • 壓縮已儲存的值。

    舉例來說,請考慮使用 LZW 算法來減少存儲值的大小。

可視性

可視性大盤 提供監視和分析您記憶體使用的內容。 使用記憶體使用率和 API 請求的實時更新圖表,您可以跟蹤您的記憶體使用率、查看目前할당的資源、監視 API 狀態和識別潛在的性能優化機會。

下表列出並描述所有 API 回應可用在監視性儀表板的 請求數據按狀態請求按 API 圖表。有關解決這些錯誤的更多資訊,請參閱 排查 。有關特定錯誤的資料上限或限制,請參閱 1>限制1> 。

狀態代碼說明
成功成功。
資料結構記憶體超限超出資料結構等級記憶體容量限制(100MB)。
資料更新矛盾因雙重更新而發生衝突。
沒有權限沒有權限存取體驗資料。這個請求不會消耗請求單位或使用額度。
內部錯誤內部錯誤。
無效的請求請求沒有所需信息或有不正確的信息。
資料結構項目超限超出資料結構等級項目數量限制(1M)。
找不到項目找不到 MemoryStoreQueue:ReadAsync()MemoryStoreSortedMap:UpdateAsync()ReadAsync() 每 2 秒進行調查,直到它在排隊中找到項目。
資料結構請求限制超出資料結構等級請求單位限制 (每分鐘 100,000 請求單位).
分區請求超限超出區域請求單位限制。
總共請求限制超出宇宙級請求單位限制。
總記憶體容量上限超出宇宙級別記憶體 quota。
項目值太大值尺寸超出限制 (32KB)。

下表列出來自客戶端的狀態代碼,目前並非在可視性儀表板上可用。

狀態代碼說明
內部錯誤內部錯誤。
未發佈的地方您必須發布此地方才能使用 MemoryStoreService。
無效的客戶端存取必須從服務伺服器呼叫 MemoryStoreService。
無效的過期時間「過期」時間必須在 0 和 3,888,000 之間。
無效的請求無法將值轉換為 JSON。
無效的請求無法將 sortKey 轉換為有效的數字或字串。
變形回歸失敗無法召喚變身回潮函數。
請求限制最近的 MemoryStores 請求擊中一個或多個限制。
更新矛盾超出最多重試次數的上限。

排障

下表列出並描述每個狀態代碼的建議解決方案:

錯誤排障選項
DataStructureCommands / 區域限制

  • 使用 請求狀態監視圖表 來確認您正在收到更多 成功 回應 than
  • 1> 沒有邀請到1> 。 限制您擊

    • 如果您收到一大量 DataStructureCommandsLimitPartitionCommandsLimit 回應,會擷取您的資料結構。
    • 0> 實現一個指數回退來尋找合理的發傳送請求。0>

總共請求限制
資料結構項目超限

  • 應用最佳練習來減少內存大小。
  • >

資料結構記憶體超限
總記憶體容量上限
資料更新矛盾

    在要求之間實現一個短

內部錯誤

  • 檢查 Roblox 狀態頁面 Roblox 狀態頁面
  • 填寫

    0> bug 報告0> ,描述您的體驗的宇宙 ID。

無效的請求
  • 請確認您的請邀請包含正確和有效的參數。參數不正確的範例包括:
    • 一個空的字串
    • 超出長度限制的字串
項目值太大
  • 將物品值碎晶或分裂成多個鑰匙。
    • 要組織集合的鍵匙,按字母順序排列它們。
  • 加密或壓縮已儲存的值。

在 Studio 測試和調試

資料在 MemoryStoreService 中之間是 Studio 和生產中隔絕的,因此在 Studio 中變更資料對生產行為沒有影響。這意味著 Studio 的 API 從 Studio 不會存取生產資料,因此您可以安全地測試記憶體存取和新功能,然後進入生產。

Studio 測試具有與生產相同的 限制和額外配額。對於基於用戶數量的測試結果,結果將因為您是 Studio 測試的唯一用戶而變得非常小,因為您是 Studio 測試的唯一用戶。當從 Studio 測試時,您可能也會發現額外的延遲和更高的錯誤率,這是因為有一些額外的檢查被執行來確認存取權限。

有關在現實體驗中調試記憶體儲存或在測試室測試時的資訊,請使用 開發者控制器