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


11

แนวปฏิบัติที่ดีที่สุดสำหรับการแคชผลลัพธ์การค้นหาที่มีการเปลี่ยนแปลงการสั่งซื้อ / คุณสมบัติสามารถทำได้อย่างไร?

พูดในแอปพลิเคชันของฉันมีคนต้องการเห็น 20 กระทู้การสนทนาล่าสุด (จาก 10,000) คำขอจะถูกส่งไปยังฐานข้อมูลservletเพื่อดึงข้อมูล 20 รายการแรกจากตารางหัวข้อการสนทนาเป็น XML / JSON หากพวกเขาต้องการที่จะเห็น 20 ถัดไปพวกเขาไปที่หน้าถัดไปของผลลัพธ์และสิ่งนี้จะดับคำขออื่นเพื่อรับล็อตถัดไป

เพื่อลดการโหลดเซิร์ฟเวอร์และการรอลูกค้าฉันต้องการแคชหน้าผลลัพธ์ก่อนหน้า อย่างไรก็ตามฉันมีสองคำถาม:

  1. ตารางที่แสดงผลลัพธ์สามารถสั่งซื้อได้โดยมากกว่าหนึ่งแอตทริบิวต์ (เช่นวันที่สร้างเธรด, ผู้เขียนเธรด, วันสุดท้าย) ซึ่งหมายความว่าคำสั่งเช่น 'ผลลัพธ์ 20 อันดับแรก' ไม่มีเหตุผลหากไม่มีบริบท (กล่าวคือเรากำลังจัดเรียงอะไร) ส่วนหน้าแล้วสื่อสารกับส่วนหลังสิ่งที่โหลดไปแล้วได้อย่างไร ความคิดแรกของฉันคือการใช้ ID สำหรับแต่ละผลลัพธ์ แต่การส่งกลับไปที่เซิร์ฟเวอร์ตามคำขอในภายหลัง ฉันจะทำสิ่งนี้ได้อย่างไร
  2. จะเกิดอะไรขึ้นหากแอตทริบิวต์ของผลลัพธ์ที่ส่งคืนก่อนหน้านี้ (เช่นล่าสุดหลังวันที่) มีการเปลี่ยนแปลง จากนั้นเราต้องการวิธีการตรวจสอบผลลัพธ์แต่ละรายการเพื่อดูว่ามีการแก้ไขฝั่งเซิร์ฟเวอร์หรือไม่เนื่องจากมีการทำเพจเอาต์ฉันจะทำสิ่งนี้ได้อย่างไร

ตัวอย่างของคุณค่อนข้างหยาบ หากเป็นเพียง 100 เธรดคุณอาจจะดีที่สุดในการดาวน์โหลดทั้งหมด 100 ครั้งเดียว หากคุณดึง 20 จาก 10,000 นั่นเป็นอีกเรื่องหนึ่ง
Dan Pichelman

@DanPichelman ขออภัยฉันยังไม่ชัดเจน มันจะมากกว่า 10,000
Goodsquishy

หมายเลขที่แก้ไขเพื่อความชัดเจน
Goodsquishy

http นี้หรือไม่ ถ้าเป็นเช่นนั้นทำไมไม่แคชตาม url? มีพารามิเตอร์ทั้งหมดใน URL หากเป็นเบราว์เซอร์ลองใช้เบราว์เซอร์แคช หากเป็นแอปให้ตั้งค่าการหมดอายุแคช Volley ของ Android ทำงานได้ค่อนข้างดี
frostymarvelous

คำตอบ:


7

ดูเหมือนว่าสิ่งที่คุณต้องการคือเสื้อคลุมสำหรับทุกพารามิเตอร์ที่กำหนดหน้า (พูด, pageNumber, pageSize, sortType, totalCountฯลฯ ) และใช้DataRequestวัตถุที่เป็นกุญแจสำคัญสำหรับการแคชกลไกของคุณ จากจุดนี้คุณมีตัวเลือกมากมายในการจัดการแคช:

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

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

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


3

ฉันอาจจะจัดการกับเรื่องนี้:

  1. ปฏิบัติตามลำดับที่แตกต่างกันตามลำดับที่แตกต่างกันทั้งหมด มันจะไม่คุ้มค่ากับการทำบัญชีพิเศษที่จะติดตามสิ่งที่ลูกค้าแต่ละรายมี (หรือส่งกลับไปซ้ำแล้วซ้ำอีก)
  2. เมื่อใดก็ตามที่หน้าผู้ใช้ให้แสดงทันทีจากแคชขณะเดียวกันก็ส่ง GET ไปยังเซิร์ฟเวอร์ที่มีแฮชหรือเวลาเข้าถึงล่าสุด เซิร์ฟเวอร์จะส่งกลับแบบเต็มหน้าหากมีการเปลี่ยนแปลง
  3. ดึงข้อมูลจากเซิร์ฟเวอร์มากกว่าหนึ่งหน้า UI พร้อมกัน ตัวอย่างเช่นหาก UI ของคุณแสดง 20 รายการแบบสอบถาม 60 ฉันต้องทดสอบรายการนี้ แต่ความคาดหวังของฉันคือว่าขนาดผลตอบแทนที่มีประสิทธิภาพมากที่สุดมักจะใหญ่กว่าจำนวนข้อมูลเฉลี่ยที่แสดงในหน้าเดียว สิ่งนี้ยังทำให้ UI ตอบสนองได้ดีสำหรับบางหน้า
  4. ดึงข้อมูล reslts เมื่อคุณอยู่ใกล้กับขอบเขต ซึ่งช่วยรักษาเวลาในการโหลดอย่างรวดเร็วจากแคช

2

แค่คิด - ในการโทรเซิร์ฟเวอร์ของคุณให้ส่งผ่านพารามิเตอร์ปกติรวมทั้งอาร์เรย์ของ MD5 แฮชที่แสดงแคชของหน้าที่ดูข้อมูลก่อนหน้านี้

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

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


ขอบคุณสำหรับคำตอบ. ฉันกำลังคิดเกี่ยวกับการแฮ็ก แต่ไม่แน่ใจว่ามันจะช่วยในสถานการณ์การสั่งซื้อใหม่หรือไม่ (เช่นมันไม่ละเอียดพอและทำงานในรูปแบบต่อหน้าไม่ใช่พื้นฐานต่อผลลัพธ์) ฉันคิดว่าย่อหน้าสุดท้ายของคุณเป็นจุดที่ดีและกำลังเริ่มคิดว่าความซับซ้อนของวิธีแก้ปัญหาใด ๆ ที่อาจเกิดประโยชน์เกินประสิทธิภาพ
Goodsquishy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.