Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Caching ด้วย Redis: Cache Data ใน PHP

บทความนี้แนะนำวิธีการใช้ Redis เพื่อ caching ข้อมูลใน PHP application โดยครอบคลุมตั้งแต่การเชื่อมต่อกับ Redis server, การ Set และ Get ข้อมูลด้วย TTL, รวมถึงตัวอ...

Caching ด้วย Redis: Cache Data ใน PHP

ในบทความที่แล้ว เราได้เรียนรู้เกี่ยวกับการติดตั้งและตั้งค่า Redis ซึ่งเป็นเครื่องมือที่ทรงพลังสำหรับการจัดการข้อมูลในหน่วยความจำ (in-memory data structure store) ในบทความนี้ เราจะมาดูวิธีการใช้งาน Redis เพื่อ caching ข้อมูลใน PHP Application ของเรา เพื่อเพิ่มประสิทธิภาพและความเร็วในการตอบสนอง

การเชื่อมต่อ Redis

ก่อนที่เราจะเริ่ม caching ข้อมูลได้ เราต้องทำการเชื่อมต่อกับ Redis Server ก่อน ใน PHP เราสามารถใช้ extension ที่ชื่อว่า phpredis ในการเชื่อมต่อได้ (ตรวจสอบให้แน่ใจว่าได้ติดตั้งและเปิดใช้งาน extension นี้แล้ว)

ตัวอย่างโค้ดสำหรับการเชื่อมต่อ Redis:

<?php

try {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379); // หรือใช้ IP และ port ที่ถูกต้อง

    echo "Connected to Redis successfully!";

} catch (Exception $e) {
    echo "Couldn't connect to Redis: " . $e->getMessage();
}

?>

อธิบายโค้ด:

  • new Redis(): สร้าง instance ของ Redis class
  • $redis->connect('127.0.0.1', 6379): พยายามเชื่อมต่อกับ Redis Server ที่ IP address 127.0.0.1 และ port 6379 (ค่า default)
  • try...catch: ใช้เพื่อจัดการ exception ที่อาจเกิดขึ้นระหว่างการเชื่อมต่อ เช่น Redis Server ไม่พร้อมใช้งาน

ข้อผิดพลาดที่พบบ่อย:

  • "Class 'Redis' not found": เกิดจากการที่ extension phpredis ยังไม่ได้ติดตั้งหรือเปิดใช้งาน ตรวจสอบ php.ini และ restart web server
  • "Connection refused": เกิดจากการที่ Redis Server ไม่ได้รัน หรือ firewall บล็อกการเชื่อมต่อ ตรวจสอบ Redis Server status และ firewall rules

การ Set และ Get Data จาก Redis

เมื่อเราเชื่อมต่อกับ Redis Server ได้แล้ว เราสามารถเริ่ม Set (เขียน) และ Get (อ่าน) ข้อมูลได้

ตัวอย่างโค้ด:

<?php

try {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    // Set ข้อมูล
    $redis->set('username', 'john.doe');

    // Get ข้อมูล
    $username = $redis->get('username');

    echo "Username: " . $username; // Output: Username: john.doe

    // Set ข้อมูลแบบมี expiration (TTL)
    $redis->setex('email', 3600, 'john.doe@example.com'); // เก็บไว้ 3600 วินาที (1 ชั่วโมง)

    // Get ข้อมูล
    $email = $redis->get('email');

    echo "<br>Email: " . $email; // Output: Email: john.doe@example.com

    // ถ้า key ไม่มีอยู่
    $nonExistentKey = $redis->get('non_existent_key');
    var_dump($nonExistentKey); // Output: NULL

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

?>

อธิบายโค้ด:

  • $redis->set('key', 'value'): Set ข้อมูล โดย key คือชื่อที่เราใช้ในการอ้างอิงข้อมูล และ value คือข้อมูลที่เราต้องการเก็บ
  • $redis->get('key'): Get ข้อมูลที่เก็บไว้ภายใต้ key
  • $redis->setex('key', ttl, 'value'): Set ข้อมูลพร้อมกำหนด Time-to-Live (TTL) ในหน่วยวินาที เมื่อ TTL หมดอายุ ข้อมูลจะถูกลบออกจาก Redis โดยอัตโนมัติ
  • ถ้า key ที่ Get ไม่มีอยู่ Redis จะ return NULL

กรณีใช้งานจริง:

  • Caching ผลลัพธ์จากการ query database: ลดโหลดของ database โดยการเก็บผลลัพธ์จากการ query ที่ใช้เวลานานไว้ใน Redis และ return ผลลัพธ์จาก Redis ในครั้งต่อไป
  • Caching API responses: ลดเวลาในการตอบสนองของ API โดยการเก็บ responses ไว้ใน Redis
  • Caching user sessions: เก็บ session data ไว้ใน Redis เพื่อให้ session สามารถใช้งานได้บนหลาย server

การกำหนด Time-to-Live (TTL)

การกำหนด TTL เป็นสิ่งสำคัญในการ caching เพราะช่วยให้เรามั่นใจได้ว่าข้อมูลใน cache จะไม่เก่าเกินไป และจะถูก refresh เมื่อจำเป็น

นอกจาก setex() แล้ว เรายังสามารถกำหนด TTL ให้กับ key ที่มีอยู่แล้วได้ด้วยคำสั่ง expire():

<?php

try {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $redis->set('product_name', 'Awesome Product');

    // กำหนด TTL เป็น 60 วินาที (1 นาที)
    $redis->expire('product_name', 60);

    // ตรวจสอบ TTL ที่เหลืออยู่
    $ttl = $redis->ttl('product_name');
    echo "Time to live for product_name: " . $ttl . " seconds<br>";

    // หลังจาก 60 วินาที product_name จะถูกลบออกจาก Redis

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

?>

อธิบายโค้ด:

  • $redis->expire('key', ttl): กำหนด TTL ให้กับ key ที่มีอยู่แล้ว ในหน่วยวินาที
  • $redis->ttl('key'): Return จำนวนวินาทีที่เหลืออยู่ก่อนที่ key จะหมดอายุ ถ้า key ไม่มีอยู่ หรือหมดอายุแล้ว จะ return -2 ถ้า key มีอยู่แต่ไม่มี TTL จะ return -1

ข้อควรจำ:

  • เลือก TTL ที่เหมาะสมกับลักษณะของข้อมูล ถ้าข้อมูลมีการเปลี่ยนแปลงบ่อย ควรใช้ TTL ที่สั้น
  • ใช้ TTL ที่ยาวขึ้นสำหรับข้อมูลที่ไม่ค่อยมีการเปลี่ยนแปลง

กรณีใช้งานจริง:

สมมติว่าเรามีฟังก์ชันที่ดึงข้อมูลสินค้าจากฐานข้อมูล:

<?php

function getProductFromDatabase($productId) {
    // จำลองการดึงข้อมูลจากฐานข้อมูล
    sleep(2); // Simulate a slow database query
    return "Product details from database for ID: " . $productId;
}

?>

เราสามารถ cache ผลลัพธ์ของฟังก์ชันนี้ได้ดังนี้:

<?php

try {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $productId = 123;
    $cacheKey = 'product:' . $productId;

    // ตรวจสอบว่ามีข้อมูลใน cache หรือไม่
    $productData = $redis->get($cacheKey);

    if ($productData) {
        echo "Product details from cache: " . $productData;
    } else {
        // ถ้าไม่มีใน cache ให้ดึงข้อมูลจาก database
        $productData = getProductFromDatabase($productId);

        // เก็บข้อมูลใน cache พร้อม TTL 600 วินาที (10 นาที)
        $redis->setex($cacheKey, 600, $productData);

        echo "Product details from database (cached): " . $productData;
    }

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

?>

ในครั้งแรกที่เรียกใช้โค้ดนี้ ข้อมูลจะถูกดึงจาก database และเก็บไว้ใน cache หลังจากนั้น ข้อมูลจะถูกดึงจาก cache โดยตรง ทำให้เร็วขึ้นอย่างมาก

สรุป:

การใช้ Redis เพื่อ caching ข้อมูลเป็นวิธีที่ง่ายและมีประสิทธิภาพในการเพิ่มความเร็วให้กับ PHP Application ของคุณ การทำความเข้าใจวิธีการเชื่อมต่อ, การ Set และ Get ข้อมูล, และการกำหนด TTL จะช่วยให้คุณใช้ Redis ได้อย่างมีประสิทธิภาพสูงสุด ในบทความถัดไป เราจะมาเรียนรู้เกี่ยวกับการวัด performance ของ application และวิธีการใช้ Xdebug Profiler เพื่อหา bottlenecks

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service