การแบ่งหน้าด้วย Progressive Caching
แคชคืออะไร? การแคชเป็นเทคนิคในการจัดเก็บสำเนาของข้อมูลแอปพลิเคชันที่ใช้บ่อยในชั้นของหน่วยความจำที่เล็กกว่าและเร็วกว่า เพื่อปรับปรุงเวลาในการดึงข้อมูล ปริมาณงาน
การแบ่งหน้าคืออะไร? การแบ่งหน้าคือกระบวนการแยกข้อมูลออกเป็นชุดๆ เช่นเดียวกับหน้าหนังสือ คำขอ 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(จำกัด) โดยที่ขีดจำกัดคือขนาดของหน้าตอบกลับ
ข้อดี :
- ไม่มีการโหลดขี้เกียจ
- การใช้ทรัพยากรอย่างมีประสิทธิภาพ
- เวลาตอบสนองคงที่
- ไม่มีคำถามที่ซับซ้อน ซึ่งคุณจะต้องเข้าใจถ้าคุณกดพารามิเตอร์เคอร์เซอร์ลง
- ไม่สามารถอ่านบันทึกก่อนหน้าได้ แต่นั่นเป็นไปไม่ได้โดยใช้การแบ่งหน้าเคอร์เซอร์ตามคำจำกัดความ
ใช่ ชีวิตเป็นเรื่องง่าย ถ้าคุณเขียนโค้ดได้
โมเดลการแคชแบบโปรเกรสซีฟนี้สามารถรองรับแหล่งข้อมูลอื่นๆ ได้ เช่น ไฟล์ เอกสาร (เราต้องการตัวประมวลผลนิพจน์แยกต่างหากสำหรับส่วนคำสั่งเนื่องจากเราไม่สามารถกดลงในไฟล์ได้) นอกจากนี้ยังเข้ากันได้อย่างมีประสิทธิภาพกับสคีมาตารางฐานข้อมูลต่างๆ ของคุณโดยไม่ต้องกังวลเกี่ยวกับโครงสร้างมากนัก
โมเดลนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ฉันเคยเห็นผู้คนติดอยู่ในสถานการณ์ที่คล้ายกันบน Stack Overflow และใช้การโหลดแบบขี้เกียจหรือการใช้งานของบุคคลที่สามโดยมีค่าใช้จ่ายเพิ่มเติมแทนวิธีแก้ปัญหาง่ายๆ วิธีการที่ใช้ร่วมกันเป็นของฉันเอง ดังนั้นจึงอาจเหมาะกับกรณีการใช้งานของคุณ กรุณาแบ่งปันแนวทางของคุณในความคิดเห็น
และถ้าคุณชอบ บทความนี้ กดปุ่มตบมือด้านล่าง มันมีความหมายมากสำหรับฉันและช่วยให้คนอื่นเห็นเรื่องราว
~ Sooraj Kumar
วิศวกรซอฟต์แวร์อาวุโส @ Astera Software





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)