การแบ่งหน้าด้วย Progressive Caching

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

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

เก็บเอาไว้

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

การแบ่งหน้า

ลองพิจารณาสถานการณ์:คุณได้รับมอบหมายงานให้พัฒนาบริการ ซึ่งจะมีจุดสิ้นสุดที่ให้บริการบันทึกจากตารางฐานข้อมูลต่างๆ สำหรับตอนนี้ สมมติว่าคุณเริ่มต้นด้วยจุดสิ้นสุดที่ให้บริการจากตารางผลิตภัณฑ์จากฐานข้อมูลของคุณ API รองรับพารามิเตอร์ตัวกรองบางตัว สมมติว่า PriceRange ผู้ผลิต ฯลฯ พิจารณาว่ามีผลิตภัณฑ์มากกว่า 5 ล้านรายการในฐานข้อมูลของคุณ และผู้ขายของคุณยังคงเพิ่มผลิตภัณฑ์อื่นๆ ลงในฐานข้อมูล

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

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

เมื่อใดที่จะทำให้แคชใช้ไม่ได้

วิธีการของฉันโดยใช้การแคชแบบก้าวหน้า

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

คุณได้รับนี้ขวา? ทำงานตามความต้องการ หยุดชั่วขณะ อย่างอื่นทิ้งไป นั่นคือวิธีที่ฉันแก้ปัญหานี้ ทีนี้มาแมปสิ่งนี้เข้ากับสถานการณ์ของเรา

แคชแบบก้าวหน้า:

รหัสแคชของเราคือ GUID ที่จะใช้ที่นี่เป็นพารามิเตอร์เคอร์เซอร์สำหรับเลขหน้าของเรา ค่าคือผู้อ่านที่หยุดชั่วคราว เราสามารถใช้แคชโดยใช้แคช LRU นอกจากนี้ ตัวจับเวลาเพิ่มเติมที่ทำเครื่องหมายทุก ๆ 8 วินาที (ผู้ใช้สามารถกำหนดค่าได้) จะกำจัดเครื่องอ่านที่ใช้งานล่าสุดน้อยที่สุด ดังนั้นเราจึงไม่เปิดการเชื่อมต่อฐานข้อมูลเป็นเวลานาน

public interface ICache
{
  void Add(Guid Key,IReader reader);
  IReader Get(Guid Key);
  void DisposeUnwanted();
}

คำขอแรก

Example request: https://localhost:9261/Products?Price=100&Manufacturer=HP

//Converted Query for our example request.
SELECT * FROM products WHERE Price = 100 AND Manufacturer Like 'HP'

ขั้นตอนที่ 3 :หยุดโปรแกรมอ่านชั่วคราว สร้าง GUID และแคช

ขั้นตอนที่ 4:เพิ่ม GUID ที่สร้างเป็นเคอร์เซอร์สำหรับหน้าถัดไปในเนื้อหาการตอบสนอง JSON ของคุณ

คำขอที่ตามมา

Example request: https://localhost:9261/Products?Price=100&Manufacturer=HP&Cursor=GUID

ขั้นตอนที่ 2 :อ่านประวัติย่อและอ่านบันทึกจนถึงขีดจำกัดของคุณ

ขั้นตอนที่ 3 & 4 :เหมือนกับคำขอแรก

ความซับซ้อนของเวลา : O(จำกัด) โดยที่ขีดจำกัดคือขนาดของหน้าตอบกลับ

ข้อดี :

  1. ไม่มีการโหลดขี้เกียจ
  2. การใช้ทรัพยากรอย่างมีประสิทธิภาพ
  3. เวลาตอบสนองคงที่
  4. ไม่มีคำถามที่ซับซ้อน ซึ่งคุณจะต้องเข้าใจถ้าคุณกดพารามิเตอร์เคอร์เซอร์ลง
  1. ไม่สามารถอ่านบันทึกก่อนหน้าได้ แต่นั่นเป็นไปไม่ได้โดยใช้การแบ่งหน้าเคอร์เซอร์ตามคำจำกัดความ

ใช่ ชีวิตเป็นเรื่องง่าย ถ้าคุณเขียนโค้ดได้

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

และถ้าคุณชอบ บทความนี้ กดปุ่มตบมือด้านล่าง มันมีความหมายมากสำหรับฉันและช่วยให้คนอื่นเห็นเรื่องราว

~ Sooraj Kumar
วิศวกรซอฟต์แวร์อาวุโส @ Astera Software