ฉันจะแคชผลลัพธ์ของ db_query () ได้อย่างไร


9

ฉันเคยviews_get_view_result()ได้รับผลจากการดูเพราะมันสะดวกในเวลานั้น ผลแบบสอบถามไม่ค่อยเปลี่ยนแปลง; ฉันสามารถใช้การดูแคชเป็นเวลา 6 วัน

หากฉันต้องการแปลงเป็นการโทรเป็นdb_query()ฉันจะเปิดใช้งานการแคชได้อย่างไร

คำตอบ:


9

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

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

หากต้องการดูตัวอย่างบางอย่างที่คุณสามารถดูฟังก์ชั่นการใช้งานที่ cache_get ()ตัวอย่างเช่นvariable_initialize ()

หากฟังก์ชั่นของคุณเรียกว่าหลายครั้งแล้วคุณอาจต้องการที่จะรวมกับแคชคงดูตัวอย่างarchiver_get_info () และหากการสร้างข้อมูลใหม่ช้าจริง ๆ คุณสามารถป้องกันไม่ให้เกิดขึ้นหลายครั้งโดยใช้กรอบการล็อคเช่นเดียวกับ variable_initialize ()

โปรดทราบว่าการแคชเคียวรีเดียวนั้นสมเหตุสมผลถ้าเป็นคิวที่ช้าเพราะ cache_get () เป็นคิวรี db ด้วยเช่นกันเว้นแต่คุณจะใช้แบ็กเอนด์แคชสำรองเช่น Memcache

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


เอาชนะฉันให้ได้;) ฉันจะทิ้งคำตอบไว้เป็นตัวอย่างของโค้ด แต่นี่เป็นข้อมูลที่เป็นประโยชน์มากกว่า
Clive

ฉันคิดว่าอินสแตนซ์ PDO นั้นไม่สามารถทำให้เป็นอนุกรม
mpdonadio

1
ไม่พวกเขาไม่ได้ แต่นั่นไม่เกี่ยวข้อง คุณไม่ได้แคชทรัพยากรผลลัพธ์ของ pdo คุณทำแคชโครงสร้างข้อมูลใด ๆ ที่คุณดึงข้อมูลจากแบบสอบถามนั้น
Berdir

ฉันจะบอกว่ามันมีความเกี่ยวข้องมาก @MotoTribe ถูกถามเกี่ยวกับการแคชผลลัพธ์จากdb_query()และต้องทำการแคชค่าจาก$results->fetchAll()และไม่ใช่$resultsกุญแจสำคัญที่จะทำให้มันใช้งานได้จริง
mpdonadio

7

ฉันไม่คิดว่าเลเยอร์ DB มีกลไกการแคชใด ๆ (แม้ว่าฉันอาจผิด) แต่คุณสามารถใช้ API แคชเริ่มต้นได้

นี่เป็นเพียงตัวอย่างพื้นฐานที่จะแคชผลลัพธ์ของแบบสอบถามเพื่อรับโหนดประเภทที่แน่นอน:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}

3

นอกเหนือจากกลไกมาตรฐานcache_set / cache_getที่ Drupal ให้ไว้หากคุณใช้ MySQL เป็นฐานข้อมูลของคุณคุณสามารถเปิดใช้งานแคชแบบสอบถามซึ่งสามารถแคชผลลัพธ์ของมุมมองหรือแบบสอบถามฐานข้อมูลอื่น ๆ ได้อย่างโปร่งใส mysqltunerสามารถช่วยในการหาค่าที่ดีสำหรับขนาดแคช

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

นอกจากนี้ยังมีกลไกการแคชสำหรับ PostgreSQLแต่ฉันไม่มีประสบการณ์โดยตรงกับมัน


3

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.