ที่เก็บหน่วยความจํา

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

MemoryStoreService เป็นบริการข้อมูลผ่านทางที่มีประสิทธิภาพสูงและความล่าช้าต่ำที่ให้การจัดเก็บข้อมูลในหน่วยความจำที่รวดเร็วในการเข้าถึงจากทุกเซิร์ฟเวอร์ในเซสชันสด คลังหน่วยความจํา เหมาะสำหรับข้อมูลที่เปลี่ยนแปลงอย่างรวดเร็วและไม่จำเป็นต้องมีความทนทานเพราะพวกเขาจะเข้าถึงได้เร็วกว่าและหายไปเมื่อถึงอายุการใช้งานสูงสุดสำหรับข้อมูลที่ต้องการเก็บไว้ในระหว่างเซสชัน ให้ใช้ คลังข้อมูล

โครงสร้างข้อมูล

แทนที่จะเข้าถึงข้อมูลดิบโดยตรง โครงสร้างข้อมูลพื้นฐานสามแบบจะถูกแชร์ข้ามเซิร์ฟเวอร์เพื่อการประมวลผลอย่างรวดเร็ว: แผนที่เรียงลําดับ , คิว และ แผนที่แฮชโครงสร้างข้อมูลแต่ละอย่างเหมาะสำหรับกรณีการใช้งานบางอย่าง:

  • การจับคู่ตามทักษะ - บันทึกข้อมูลผู้ใช้ เช่น ระดับทักษะ ในคิวร่วมกันระหว่างเซิร์ฟเวอร์ และใช้เซิร์ฟเวอร์ล็อบบี้เพื่อดำเนินการจับคู่เป็นระยะเวลาเป็นประจำ
  • การซื้อขายและประมูลข้ามเซิร์ฟเวอร์ - เปิดใช้งานการซื้อขายแบบทั่วถึงระหว่างเซิร์ฟเวอร์ต่างๆ ซึ่งผู้ใช้สามารถเสนอราคาสินค้าที่มีราคาเปลี่ยนแปลงแบบเรียลไทม์ได้ ด้วยแผนภูมิคีย์-ค่าคู่ที่เรียงลําดับได้
  • ลีดเดอร์บอร์ดระดับโลก - เก็บและอัปเดตอันดับผู้ใช้บนลีดเดอร์บอร์ดร่วมกันภายในแผนที่ที่เรียงลําดับได้ แผนที่จัดเรียง * คลังสินค้าร่วม - บันทึกรายการสินค้าและสถิติในแผนที่คลังสินค้าร่วม ที่ผู้ใช้สามารถใช้รายการสินค้าพร้อมกันได้ระหว่างกัน * แคชสําหรับข้อมูลถาวร - ซิงค์และคัดลอกข้อมูลถาวรของคุณในคลังข้อมูลไปยังคลังหน่วยความจําที่สามารถใช้เป็นแคชและปรับปรุงประสิทธิภาพประสบการณ์ของคุณ

โดยทั่วไป หากคุณต้องการเข้าถึงข้อมูลตามกุญแจที่เฉพาะเจาะจงใช้แผนที่ความเร็วหากต้องการให้ข้อมูลดังกล่าวถูกสั่งซื้อให้ใช้แผนที่เรียงลําดับหากต้องการประมวลผลข้อมูลในลำดับเฉพาะ ให้ใช้คิว

ข้อจํากัดและจํานวนเงินที่กำหนด

การดำเนินการตัวเก็บหน่วยความจำมีค่าใช้จ่ายของการใช้หน่วยความจำสำหรับขนาดหน่วยความจำ คำขอ API และขนาดโครงสร้างข้อมูล

คลังหน่วยความจํามีนโยบายการเนรเทศตามเวลาหมดอายุ ซึ่งเรียกว่าเวลาที่มีชีวิต (TTL)ไอเทมจะถูกไล่ออกหลังจากหมดอายุและความจําเป็นของหน่วยความจําจะถูกปลดปล่อยสําหรับการบันทึกใหม่เมื่อคุณถึงขีดจํากัดความจํา คําขอเขียนทั้งหมดที่ตามมาจะล้มเหลวจนกว่าไอเทมจะหมดอายุหรือคุณจะลบพวกเขาด้วยตนเอง

ความจุของหน่วยความจำส่วนสัดส่วน

ขีดจํากัดความจําเพิ่มจำนวนความจําทั้งหมดที่ประสบการณ์สามารถใช้ได้มันไม่ใช่ค่าคงที่แทนที่จะเปลี่ยนไปตามเวลาขึ้นอยู่กับจํานวนผู้ใช้ในประสบการณ์ตามสูตรต่อไปนี้: 64KB + 1KB * [จํานวนผู้ใช้] ความจำกัดใช้กับระดับประสบการณ์แทนระดับเซิร์ฟเวอร์

เมื่อผู้ใช้เข้าร่วมประสบการณ์แล้ว ความจุหน่วยความจำเพิ่มเติมที่เพิ่มขึ้นจะพร้อมใช้งานทันทีเมื่อผู้ใช้ออกจากประสบการณ์แล้ว ความจุจะไม่ลดลงทันทีมีระยะเวลาการย้อนกลับของแปดวันก่อนที่ความจำกัดจะประเมินค่าต่ำกว่า

หลังจากประสบการณ์ของคุณถึงขีดจํากัดขนาดหน่วยความจําแล้ว คําขอ API ใดๆ ที่เพิ่มขนาดหน่วยความจําจะล้มเหลวเสมอคำขอที่ลดขนาดหรือไม่เปลี่ยนขนาดหน่วยความจำยังคงประสบความสำเร็จ

ด้วยแดชบอร์ด การสังเกตการณ์ คุณสามารถดูความจุหน่วยความจำของประสบการณ์ของคุณในเวลาจริงโดยใช้แผนภูมิ การใช้หน่วยความจำ

ขีดจํากัดคําขอ API

สำหรับขีดจํากัดคําขอ API มีความจําเป็นของ หน่วยคําขอ ที่ใช้สําหรับการโทร API ทั้งหมด MemoryStoreServiceความจุคือ 1000 + 100 * [จํานวนผู้ใช้พร้อมกัน] หน่วยคําขอต่อนาที

การโทร API ส่วนใหญ่ใช้เพียงหน่วยคำขอเดียวเท่านั้น โดยมีข้อยกเว้นเล็กน้อย:

  • MemoryStoreSortedMap:GetRangeAsync()

    บริโภคหน่วยตามจํานวนรายการที่ส่งคืนตัวอย่างเช่น หากวิธีนี้ส่งคืนรายการ 10 รายการ การโทรจะนับเป็น 10 หน่วยคำขอหากส่งคืนคำตอบว่างเปล่า จะนับเป็นหน่วยคำขอหนึ่ง

  • MemoryStoreQueue:ReadAsync()

    ใช้หน่วยตามจํานวนรายการที่ส่งคืนเช่นเดียวกับ MemoryStoreSortedMap:GetRangeAsync() แต่ใช้หน่วยเพิ่มเติมทุกๆ สองวินาทีในระหว่างการอ่านระบุเวลาอ่านสูงสุดด้วยพารามิเตอร์ waitTimeout

  • MemoryStoreHashMap:UpdateAsync()

    ใช้อย่างน้อยสองหน่วย

  • MemoryStoreHashMap:ListItemsAsync()

    ใช้ [จํานวนพาร์ติชันที่สแกน] + [รายการที่ส่งคืน] หน่วย

ความจำกัดของคำขอยังถูกใช้ในระดับประสบการณ์แทนระดับเซิร์ฟเวอร์สิ่งนี้ให้ความยืดหยุ่นในการจัดสรรคำขอระหว่างเซิร์ฟเวอร์ตราบใดที่อัตราคำขอรวมไม่เกินขีดจำกัดหากคุณเกินความจำกัด คุณจะได้รับคำตอบข้อผิดพลาดเมื่อบริการลดความเร็วคำขอของคุณ

ด้วยคุณสมบัติ การสังเกตได้ ที่มีอยู่ คุณสามารถดูความต้องการของหน่วยคำขอของประสบการณ์ของคุณในเวลาจริงได้

ขีดจํากัดขนาดโครงสร้างข้อมูล

สำหรับแผนที่หรือคิวเรียงลําดับเดียว จะมีขีดจํากัดขนาดและจํานวนรายการต่อไปนี้:

  • จํานวนรายการสูงสุด: 1,000,000
  • ขนาดสูงสุดทั้งหมด (รวมถึงกุญแจสําหรับแผนที่ที่จัดเรียง): 100 MB

ขีดจํากัดต่อส่วนหนึ่ง

ดู ขีดจํากัดต่อส่วน .

แนวทางที่ดีที่สุด

เพื่อให้การใช้งานหน่วยความจําของคุณเป็นไปอย่างมีประสิทธิภาพและหลีกเลี่ยงการถึงขีดจํากัด ให้ทําตามแนวทางที่ดีที่สุดเหล่านี้:

  • ลบรายการที่ประมวลผลแล้ว: ทำความสะอาดอย่างต่อเนื่องโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับคิวและ MemoryStoreSortedMap:RemoveAsync() สำหรับแผนที่ที่จัดเรียงได้สามารถปลดปล่อยหน่วยความจำและรักษาโครงสร้างข้อมูลให้ทันเวลา

  • ตั้งเวลาหมดอายุเป็นระยะเวลาที่เล็กที่สุดเท่าที่เป็นไปได้เมื่อเพิ่มข้อมูล: แม้ว่าเวลาหมดอายุเริ่มต้นจะเป็น 45 วันสำหรับทั้ง MemoryStoreQueue:AddAsync() และ MemoryStoreSortedMap:SetAsync() แต่การตั้งเวลาที่สั้นที่สุดจะสามารถล้างข้อมูลเก่าได้โดยอัตโนมัติเพื่อป้องกันไม่ให้พวกเขาเติมความจุหน่วยความจำของคุณ

    • อย่าเก็บข้อมูลจํานวนมากด้วยระยะเวลาหมดอายุที่ยาวนานเนื่องจากมีความเสี่ยงที่จะเกินขีดจํากัดความทรงจําและอาจทําให้เกิดปัญหาที่อาจทําลายประสบการณ์ทั้งหมดของคุณ
    • เสมอเลือกที่จะลบไอเทมที่ไม่จำเป็นโดยเฉพาะหรือตั้งเวลาหมดอายุไอเทมสั้น ๆ
    • โดยทั่วไปคุณควรใช้การลบโดยเฉพาะเพื่อปล่อยหน่วยความจําและการหมดอายุไอเทมเป็นเครื่องมือความปลอดภัยเพื่อป้องกันไม่ให้ไอเทมที่ไม่ได้ใช้งานเป็นเวลานานเป็นเวลานาน
  • เก็บค่าที่จำเป็นเท่านั้นในหน่วยความจำ

    ตัวอย่างเช่น สำหรับประสบการณ์บ้านประมูลคุณต้องรักษาเส้นเดิมพันสูงสุดเท่านั้นคุณสามารถใช้ MemoryStoreSortedMap:UpdateAsync() บนกุญแจหนึ่งเพื่อรักษาราคาสูงสุดไว้แทนที่จะรักษาราคาทั้งหมดในโครงสร้างข้อมูลของคุณ

  • ใช้ การยกเลิกอย่างก้าวกระโดด เพื่อช่วยให้อยู่ภายใต้ขีดจํากัดคำขอ API ได้

    ตัวอย่างเช่น หากคุณได้รับ DataUpdateConflict คุณอาจลองอีกครั้งหลังจากสองวินาทีแล้วสี่ แปด ฯลฯแทนที่จะส่งคำขออย่างต่อเนื่องไปยัง MemoryStoreService เพื่อรับคำตอบที่ถูกต้อง

  • แยกโครงสร้างข้อมูลยักษ์เป็นหลายโครงสร้างขนาดเล็กโดย แยกส่วน

    มักง่ายกว่าที่จะจัดการข้อมูลในโครงสร้างขนาดเล็กแทนที่จะเก็บทุกอย่างในโครงสร้างข้อมูลขนาดใหญ่วิธีนี้ยังสามารถช่วยหลีกเลี่ยงการใช้งานและข้อจํากัดอัตราได้ตัวอย่างเช่น หากคุณมีแผนที่จัดเรียงที่ใช้คํานําหน้าสําหรับกุญแจของมัน ให้พิจารณาแยกแยะแต่ละคํานําหน้าออกเป็นแผนที่จัดเรียงเองสำหรับประสบการณ์ที่ได้รับความนิยมอย่างมาก คุณอาจแยกผู้ใช้ออกเป็นหลายแผนที่ตามตัวเลขสุดท้ายของรหัสผู้ใช้ของพวกเขา

  • บีบอัดมูลค่าที่เก็บไว้

    ตัวอย่างเช่น พิจารณาใช้อัลกอริทึ่ม LZW เพื่อลดขนาดของค่าที่เก็บไว้

การสังเกตเห็น

แดชบอร์ดการสังเกตการณ์ ให้ข้อมูลและการวิเคราะห์สำหรับการตรวจสอบและแก้ไขปัญหาการใช้เครื่องจัดเก็บหน่วยความจําของคุณด้วยการอัปเดตแผนภาพแบบเรียลไทม์เกี่ยวกับแง่มุมต่างๆ ของการใช้หน่วยความจําและคําขอ API คุณสามารถติดตามรูปแบบการใช้หน่วยความจําของประสบการณ์ของคุณ, ดูความคิดเห็นปัจจุบันที่ได้รับการจัดสรร, ตรวจสอบสถานะ API และระบุปัญหาที่อาจเกิดขึ้นเพื่อการปรับปรุงประสิทธิภาพ

ตารางต่อไปนี้ระบุรหัสสถานะของคำตอบ API ทั้งหมดที่มีอยู่ในแดชบอร์ดความสามารถในการสังเกตการณ์ จํานวนคําขอตามสถานะ และ คําขอโดย API x สถานะ ชาร์ทสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดเหล่านี้ดูที่ การแก้ปัญหาสำหรับความจำกัดหรือขีดจํากัดเฉพาะที่เกี่ยวข้องกับข้อผิดพลาด ดู ข้อจํากัดและความจำกัด

รหัสสถานะคําอธิบาย
สําเร็จสำเร็จ
ความจําของโครงสร้างข้อมูลเกินขีดจํากัดเกินขีดจํากัดขนาดหน่วยความจําระดับโครงสร้างข้อมูล (100MB)
ข้อขัดแย้งการอัปเดตข้อมูลความขัดแย้งเนื่องจากการอัปเดตพร้อมกัน
ปฏิเสธการเข้าถึงไม่ได้รับอนุญาตให้เข้าถึงข้อมูลประสบการณ์ คำขอนี้ไม่ใช้หน่วยคำขอหรือใช้ความจำกัดของความถี่
ข้อผิดพลาดภายในข้อผิดพลาดภายใน
คำขอไม่ถูกต้องคำขอไม่มีข้อมูลที่จำเป็นหรือมีข้อมูลที่ผิดรูปแบบ
ไอเทมโครงสร้างข้อมูลเกินขีดจำกัดเกินขีดจํากัดจํานวนระดับโครงสร้างข้อมูล (1M)
ไม่พบไอเทมไม่พบรายการใน MemoryStoreQueue:ReadAsync() หรือ MemoryStoreSortedMap:UpdateAsync()``ReadAsync() โหวตทุก 2 วินาทีและส่งรหัสสถานะนี้จนกว่าจะพบรายการในคิว
คำขอโครงสร้างข้อมูลเกินขีดจำกัดเกินขีดจํากัดคำขอระดับโครงสร้างข้อมูล (100,000 คำขอต่อนาที)
คำขอปาร์ติชันเกินขีดจํากัดเกินขีดจํากัดคําขอพาร์ติชัน
คำขอทั้งหมดเกินขีดจํากัดเกินขีดจํากัดหน่วยคําขอระดับจักรวาล
ความจําทั้งหมดเกินขีดจํากัดเกินขีดจํากัดความทรงจําระดับจักรวาล
ขนาดมูลค่าไอเทมใหญ่เกินไปขนาดค่าเกินขีดจํากัด (32KB)

ตารางต่อไปนี้ระบุรหัสสถานะจากด้านไคลเอนต์ซึ่งไม่สามารถใช้ได้ในปัจจุบันในแดชบอร์ดความสามารถในการสังเกต

รหัสสถานะคําอธิบาย
ข้อผิดพลาดภายในข้อผิดพลาดภายใน
สถานที่ที่ไม่เผยแพร่คุณต้องเผยแพร่สถานที่นี้เพื่อใช้ MemoryStoreService
การเข้าถึงลูกค้าไม่ถูกต้องต้องเรียกบริการ MemoryStore จากเซิร์ฟเวอร์
เวลาหมดอายุไม่ถูกต้องเวลาของฟิลด์ 'หมดอายุ' ต้องอยู่ระหว่าง 0 และ 3,888,000
คำขอไม่ถูกต้องไม่สามารถแปลงค่าเป็น json ได้
คำขอไม่ถูกต้องไม่สามารถแปลง sortKey เป็นหมายเลขหรือสตริงที่ถูกต้องได้
เปลี่ยนการโทรกลับล้มเหลวไม่สามารถเรียกฟังก์ชันการโทรกลับการเปลี่ยนแปลงได้
คําขอลดความเร็วคำขอเก็บหน่วยความจําล่าสุดได้รับหนึ่งหรือมากกว่าขีดจํากัด
อัปเดตความขัดแย้งเกินจํานวนความพยายามสูงสุด

การแก้ปัญหา

ตารางต่อไปนี้ระบุรายการและอธิบายโซลูชันที่แนะนำสำหรับรหัสสถานะการตอบสนองแต่ละรหัส:

ข้อผิดพลาดตัวเลือกการแก้ปัญหา
คำขอโครงสร้างข้อมูลเกินขีดจํากัด / คำขอการแบ่งส่วนเกินขีดจํากัด
  • เพิ่มแคชท้องถิ่นโดยบันทึกข้อมูลไปยังตัวแปรอื่นและตรวจสอบอีกครั้งหลังระยะเวลาที่กำหนด เช่น 30 วินาที:
  • ใช้แผนภูมิ จํานวนคําขอตามสถานะ เพื่อตรวจสอบว่าคุณกำลังได้รับคําตอบ ความสําเร็จ มากกว่า NoItemFounds จำกัดจำนวนครั้งที่คุณตี MemoryStoreService ด้วยคำขอที่ล้มเหลว:
  • ใช้การชะลอตัวสั้นๆ ระหว่างคำขอ:
  • ปฏิบัติตามแนวทางที่ดีที่สุด รวมถึง:
    • แยกโครงสร้างข้อมูลของคุณหากคุณได้รับจํานวนมากของการตอบสนอง DataStructureRequestsOverLimit / PartitionRequestsOverLimit :
    • ใช้การยกเลิกทวีคูณเพื่อค้นหาอัตราคำขอที่เหมาะสมในการส่ง
คำขอทั้งหมดเกินขีดจํากัด
ไอเทมโครงสร้างข้อมูลเกินขีดจำกัด
ความจําของโครงสร้างข้อมูลเกินขีดจํากัด
ความจําทั้งหมดเกินขีดจํากัด
ข้อขัดแย้งการอัปเดตข้อมูล
  • ใช้การดีเลย์สั้นระหว่างคำขอเพื่อหลีกเลี่ยงการอัปเดตคีย์เดียวกันหลายครั้งในเวลาเดียวกัน:
  • สำหรับแผนที่ที่เรียงลําดับให้ใช้ฟังก์ชัน callback บนวิธี MemoryStoreSortedMap:UpdateAsync() เพื่อยกเลิกคําขอหลังจากจํานวนครั้งที่กําหนดเองหลังจากที่รหัสตัวอย่างต่อไปแสดง:
  • Example of Aborting Request

    local MemoryStoreService = game:GetService("MemoryStoreService")
    local map = MemoryStoreService:GetSortedMap("AuctionItems")
    function placeBid(itemKey, bidAmount)
    map:UpdateAsync(itemKey, function(item)
    item = item or { highestBid = 0 }
    if item.highestBid < bidAmount then
    item.highestBid = bidAmount
    return item
    end
    print("item is "..item.highestBid)
    return nil
    end, 1000)
    end
    placeBid("MyItem", 50)
    placeBid("MyItem", 40)
    print("done")
  • ตรวจสอบเพื่อดูว่าคุณกําลังโทร MemoryStoreService อย่างมีประสิทธิภาพเพื่อหลีกเลี่ยงความขัดแย้งในทางที่ดีคุณไม่ควรส่งคำขอมากเกินไป:
  • ลบรายการอย่างต่อเนื่องเมื่ออ่านแล้วโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับคิวและ MemoryStoreSortedMap:RemoveAsync() สำหรับแผนที่ที่จัดเรียง
ข้อผิดพลาดภายใน

  • ตรวจสอบหน้าสถานะ Roblox .
  • ส่งรายงานข้อบกพร่อง
  • อธิบายปัญหากับ ID จักรวาลของประสบการณ์ของคุณ.

คำขอไม่ถูกต้อง
  • ตรวจสอบให้แน่ใจว่าคุณรวมพารามิเตอร์ที่ถูกต้องและถูกต้องในคำขอของคุณ ตัวอย่างพารามิเตอร์ที่ไม่ถูกต้องรวมถึง:
    • สตริงว่างเปล่า
    • สตริงที่เกินขีดจำกัดความยาว
ขนาดมูลค่าไอเทมใหญ่เกินไป
  • แยกหรือแยกมูลค่าของไอเทมเป็นหลายกุญแจ
    • เพื่อจัดระเบียบกุญแจที่กลุ่มรวมกันโดยเรียงลําดับตามตัวอักษรโดยการเพิ่ม prefix ให้กับกุญแจ
  • การเข้ารหัสหรือบีบอัดค่าที่เก็บไว้

ทดสอบและแก้ไขข้อผิดพลาดใน Studio

ข้อมูลใน MemoryStoreService ถูกแยกระหว่าง Studio และการผลิตดังนั้นการเปลี่ยนแปลงข้อมูลใน Studio จะไม่ส่งผลต่อพฤติกรรมการผลิตซึ่งหมายความว่าการโทร API จาก Studio ไม่สามารถเข้าถึงข้อมูลการผลิตได้ ทำให้คุณสามารถทดสอบความจำได้อย่างปลอดภัยและคุณสมบัติใหม่ก่อนที่จะไปสู่การผลิตได้

การทดสอบสตูดิโอมีข้อจํากัดและจํานวนเดียวกับ การผลิต เช่นเดียวกับการผลิตสำหรับค่าใช้จ่ายที่คำนวณตามจํานวนผู้ใช้ค่าใช้จ่ายที่ได้รับอาจเล็กมากเนื่องจากคุณเป็นผู้ใช้เพียงรายเดียวสําหรับการทดสอบ Studioเมื่อทดสอบจากสตูดิโอ คุณอาจสังเกตเห็นความแลคและอัตราการเกิดข้อผิดพลาดที่สูงขึ้นเล็กน้อยเมื่อเทียบกับการใช้งานในการผลิตเนื่องจากการตรวจสอบเพิ่มเติมบางอย่างที่ดำเนินการเพื่อตรวจสอบการเข้าถึงและสิทธิ์

สำหรับข้อมูลเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดในการจัดเก็บหน่วยความจําในประสบการณ์สดหรือเมื่อทดสอบในสตูดิโอใช้ คอนโซลนักพัฒนา