PlusMagi's Blog By Pitt Phunsanit Backend PHP: การใช้ Object Caching (Redis/Memcached) ลดภาระฐานข้อมูล

PHP: การใช้ Object Caching (Redis/Memcached) ลดภาระฐานข้อมูล

ในโลกของระบบแอปพลิเคชันระดับองค์กร (Enterprise Applications) หรือเว็บไซต์ที่มีปริมาณ Traffic สูง การเรียกใช้ข้อมูลจากฐานข้อมูล (Database Query) ถือเป็นคอขวด (Bottleneck) ที่สำคัญที่สุดอย่างหนึ่ง ภาระในการประมวลผลของ PostgreSQL, Network Latency, และ Overhead ของการเชื่อมต่อ ล้วนส่งผลโดยตรงต่อเวลาตอบสนอง (Response Time) ของผู้ใช้งาน

เพื่อแก้ไขปัญหานี้ Object Caching จึงเป็นกลไกที่ขาดไม่ได้ Object Caching คือการเก็บผลลัพธ์ของการคำนวณที่ซับซ้อน, รายงานสรุปภาพรวม, หรือข้อมูลโปรไฟล์ที่ไม่เปลี่ยนแปลงบ่อยนัก ไว้ในหน่วยความจำชั่วคราว (In-memory store) แทนที่จะต้องไปดึงจาก PostgreSQL ทุกครั้งที่ร้องขอ

💡 Object Caching คืออะไร และทำไมต้องใช้ Redis/Memcached?

Redis และ Memcached คือเครื่องมือหลักที่ใช้ในการทำ Object Caching โดยทั้งสองตัวนี้ทำงานในรูปแบบ Key-Value Store ที่มีความเร็วในการอ่านและเขียนในระดับ Millisecond ซึ่งเร็วกว่าการเข้าถึงข้อมูลจากดิสก์ของ PostgreSQL อย่างมาก เมื่อเราใช้ Cache เรากำลังข้ามขั้นตอนการเชื่อมต่อและการประมวลผลที่หนักหน่วงของฐานข้อมูลไปได้ ทำให้ประสิทธิภาพของระบบโดยรวมพุ่งสูงขึ้นอย่างเห็นได้ชัด

⚙️ หลักการทำงาน: การเปลี่ยน Workflow จาก DB ไป Cache

การใช้ Object Caching จะเปลี่ยนขั้นตอนการทำงานของแอปพลิเคชันอย่างสิ้นเชิง แทนที่จะเป็นเส้นทางเดิมที่ต้อง Query ฐานข้อมูลทุกครั้ง (Application $\rightarrow$ PostgreSQL) ระบบจะเปลี่ยนเป็นลำดับความสำคัญดังนี้:

  1. Check Cache: แอปพลิเคชันจะตรวจสอบก่อนว่าข้อมูลที่ต้องการมีอยู่ใน Redis/Memcached หรือไม่
  2. Cache Hit: หากพบข้อมูล (Cache Hit) ระบบจะดึงข้อมูลจากหน่วยความจำทันที (เร็วที่สุด)
  3. Cache Miss: หากไม่พบข้อมูล (Cache Miss) ระบบจึงจะดำเนินการ Query ข้อมูลจาก PostgreSQL
  4. Store Cache: หลังจากได้ข้อมูลจาก PostgreSQL แล้ว ระบบจะบันทึกข้อมูลนั้นลงใน Cache พร้อมกำหนดอายุ (TTL: Time To Live) ก่อนส่งกลับไปยังผู้ใช้งาน

💻 ตัวอย่างการใช้งานใน PHP (Conceptual Code)

สมมติว่าเราต้องการดึงรายการสินค้าที่เกี่ยวข้องกับหมวดหมู่ (Category) โดยใช้ PHP และ Redis ในการทำ Caching:

PHP

// 1. กำหนด Key และ Parameters
$cacheKey = 'category:1:products';
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 2. ตรวจสอบ Cache ก่อน
$cachedData = $redis->get($cacheKey);

if ($cachedData) {
    echo "[Cache Hit] ดึงข้อมูลจาก Redis สำเร็จ!";
    return json_decode($cachedData, true);
} else {
    // 3. Cache Miss: ต้อง Query จาก PostgreSQL
    $sql = "SELECT product_name, price FROM products WHERE category_id = 1 LIMIT 3;";
    // (Assume $pdo is the PostgreSQL connection object)
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 4. บันทึกผลลัพธ์ลง Cache (กำหนด TTL 1 ชั่วโมง)
    $redis->setex($cacheKey, 3600, json_encode($results));
    echo "[Cache Miss] Query PostgreSQL และบันทึกผลลัพธ์ลง Redis แล้ว";
    return $results;
}

หมายเหตุ: ในกรณีที่ Cache Miss ระบบจะรันคำสั่ง PostgreSQL ดังนี้:

SQL

SELECT product_name, price FROM products WHERE category_id = 1 LIMIT 3;

✅ บทสรุป: ประโยชน์ที่ได้รับจากการทำ Object Caching

การนำ Object Caching ด้วย Redis หรือ Memcached มาใช้ร่วมกับ PHP และ PostgreSQL ไม่เพียงแต่ช่วยลดภาระในการประมวลผลของฐานข้อมูลเท่านั้น แต่ยังช่วยให้แอปพลิเคชันสามารถรองรับผู้ใช้งานจำนวนมากพร้อมกัน (High Concurrency) ได้อย่างมีเสถียรภาพ ทำให้เวลาในการตอบสนอง (Latency) ลดลงอย่างมีนัยสำคัญ และยกระดับประสิทธิภาพโดยรวมของระบบให้เทียบเท่ากับระดับ Enterprise-grade ได้อย่างแท้จริง

Exit mobile version