メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

การ Implement Caching

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

การ Implement Caching เพื่อเพิ่มประสิทธิภาพ API

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการใช้ Queues สำหรับ Background Processing เพื่อจัดการกับ Task ที่ใช้เวลานานและไม่จำเป็นต้องทำทันที ในบทนี้ เราจะมาดูอีกหนึ่งเทคนิคสำคัญในการเพิ่มประสิทธิภาพของ API นั่นคือ Caching

Caching คืออะไร?

Caching คือการเก็บข้อมูลที่ถูกเรียกใช้งานบ่อยๆ ไว้ในที่ที่เข้าถึงได้รวดเร็ว เพื่อลดระยะเวลาในการดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล) ในครั้งต่อไปที่มีการร้องขอข้อมูลเดียวกัน

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

ทำไมต้องใช้ Caching?

การใช้ Caching ช่วยให้ API ของคุณ:

  • ตอบสนองได้รวดเร็วขึ้น: เนื่องจากข้อมูลถูกดึงมาจาก Cache ซึ่งเร็วกว่าการดึงจากฐานข้อมูล
  • ลด Load บนฐานข้อมูล: เนื่องจากไม่ต้อง Query ฐานข้อมูลบ่อยๆ
  • ปรับปรุง User Experience: ผู้ใช้งานจะได้รับประสบการณ์ที่ดีขึ้นเนื่องจาก API ตอบสนองได้เร็ว
  • ลดค่าใช้จ่าย: ในบางกรณี การลด Load บนฐานข้อมูลอาจช่วยลดค่าใช้จ่ายในการจัดการฐานข้อมูลได้

Caching ทำงานอย่างไร?

โดยทั่วไป Caching ทำงานดังนี้:

  1. Client ส่ง Request มายัง API
  2. API ตรวจสอบว่าข้อมูลที่ต้องการมีอยู่ใน Cache หรือไม่
  3. Cache Hit: ถ้ามีข้อมูลใน Cache จะส่งข้อมูลนั้นกลับไปให้ Client ทันที
  4. Cache Miss: ถ้าไม่มีข้อมูลใน Cache จะดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล)
  5. API ส่งข้อมูลกลับไปให้ Client และบันทึกข้อมูลนั้นไว้ใน Cache เพื่อใช้ในอนาคต
Caching Flow

ภาพแสดงการทำงานของ Caching

ประเภทของ Cache

มี Cache หลายประเภท แต่ที่นิยมใช้กันใน Web Application มีดังนี้:

  • Browser Cache: Cache ที่ Browser เก็บข้อมูลไว้ เช่น รูปภาพ, CSS, JavaScript เพื่อลดการ Download ข้อมูลซ้ำๆ
  • Server-Side Cache: Cache ที่ฝั่ง Server เก็บข้อมูลไว้ เช่น ผลลัพธ์ของ API Call, HTML Fragments
  • Database Cache: Cache ที่ Database Server จัดการ เช่น Query Cache, Result Cache
  • Object Cache: Cache ที่เก็บ Object ที่สร้างจาก Code ของเรา
  • CDN (Content Delivery Network): Cache ที่กระจายอยู่ตาม Server ทั่วโลก เพื่อให้ผู้ใช้งานสามารถเข้าถึง Content ได้จาก Server ที่ใกล้ที่สุด

ในบทนี้ เราจะเน้นที่ Server-Side Cache โดยเฉพาะอย่างยิ่งการใช้ Cache เพื่อเก็บผลลัพธ์ของ API Calls

การ Implement Caching ใน PHP

มีหลายวิธีในการ Implement Caching ใน PHP ขึ้นอยู่กับความต้องการและขนาดของ Application ของคุณ

1. File-Based Caching

วิธีที่ง่ายที่สุดคือการเก็บข้อมูล Cache ไว้ในไฟล์

<?php

function get_data_from_api($id) {
  $cache_file = 'cache/data_' . $id . '.json';
  $cache_time = 3600; // 1 hour

  if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
    // Cache Hit
    $data = json_decode(file_get_contents($cache_file), true);
    return $data;
  } else {
    // Cache Miss
    // Simulate API call
    sleep(2); // Simulate slow API
    $data = ['id' => $id, 'name' => 'Item ' . $id, 'description' => 'Description of Item ' . $id];

    // Save to cache
    file_put_contents($cache_file, json_encode($data));

    return $data;
  }
}

// Example usage
$id = 123;
$data = get_data_from_api($id);

header('Content-Type: application/json');
echo json_encode($data);

?>

คำอธิบาย:

  • ฟังก์ชัน get_data_from_api() จะตรวจสอบว่ามีไฟล์ Cache สำหรับ $id นั้นหรือไม่
  • ถ้ามีไฟล์ Cache และยังไม่หมดอายุ ($cache_time) จะอ่านข้อมูลจากไฟล์ Cache (Cache Hit)
  • ถ้าไม่มีไฟล์ Cache หรือหมดอายุแล้ว จะจำลองการเรียก API (sleep(2) เพื่อจำลอง API ที่ช้า) และบันทึกผลลัพธ์ลงในไฟล์ Cache (Cache Miss)

ข้อดี:

  • ง่ายต่อการ Implement

ข้อเสีย:

  • ประสิทธิภาพไม่ดีเท่าที่ควร โดยเฉพาะอย่างยิ่งเมื่อมี Cache จำนวนมาก
  • ต้องจัดการเรื่องการลบไฟล์ Cache เมื่อข้อมูลมีการเปลี่ยนแปลง

2. Memcached/Redis

Memcached และ Redis เป็น In-Memory Data Store ที่นิยมใช้กันในการทำ Caching

Memcached: เป็น Distributed Memory Object Caching System เน้นการ Cache ข้อมูลที่ไม่มีโครงสร้างซับซ้อน

Redis: เป็น In-Memory Data Structure Store รองรับ Data Structure ที่หลากหลาย เช่น String, Hash, List, Set, Sorted Set

Redis มักถูกเลือกใช้มากกว่า Memcached เนื่องจากมีความยืดหยุ่นในการใช้งานมากกว่า

ตัวอย่างการใช้ Redis:

<?php

require 'vendor/autoload.php'; // Assuming you're using Composer

use Predis\Client;

$redis = new Client([
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
]);

function get_data_from_api_with_redis($id) {
  $cache_key = 'data:' . $id;
  $cache_time = 3600; // 1 hour

  global $redis;

  $cached_data = $redis->get($cache_key);

  if ($cached_data) {
    // Cache Hit
    $data = json_decode($cached_data, true);
    return $data;
  } else {
    // Cache Miss
    // Simulate API call
    sleep(2); // Simulate slow API
    $data = ['id' => $id, 'name' => 'Item ' . $id, 'description' => 'Description of Item ' . $id];

    // Save to cache
    $redis->setex($cache_key, $cache_time, json_encode($data));

    return $data;
  }
}

// Example usage
$id = 456;
$data = get_data_from_api_with_redis($id);

header('Content-Type: application/json');
echo json_encode($data);

?>

คำอธิบาย:

  • เราใช้ Library Predis ในการเชื่อมต่อกับ Redis
  • ฟังก์ชัน get_data_from_api_with_redis() จะตรวจสอบว่ามีข้อมูลใน Redis ด้วย Key $cache_key หรือไม่
  • ถ้ามีข้อมูลใน Redis จะอ่านข้อมูลจาก Redis (Cache Hit)
  • ถ้าไม่มีข้อมูลใน Redis จะจำลองการเรียก API และบันทึกผลลัพธ์ลงใน Redis พร้อมกำหนด TTL (Time To Live) เป็น $cache_time (Cache Miss)

ข้อดี:

  • ประสิทธิภาพสูง
  • รองรับการ Expire Cache ได้
  • รองรับ Data Structure ที่หลากหลาย (Redis)

ข้อเสีย:

  • ต้องติดตั้งและตั้งค่า Memcached/Redis Server
  • ต้องใช้ Library เพิ่มเติม

การตั้งค่า Caching Strategy

การเลือก Caching Strategy ที่เหมาะสมเป็นสิ่งสำคัญ

  • Cache Expiration: กำหนดระยะเวลาที่ Cache จะหมดอายุ ควรเลือกค่าที่เหมาะสมกับความถี่ในการเปลี่ยนแปลงของข้อมูล
  • Cache Invalidation: เมื่อข้อมูลมีการเปลี่ยนแปลง จะต้องลบ Cache ที่เกี่ยวข้อง เพื่อให้ API ดึงข้อมูลล่าสุดมาใช้งาน
  • Cache Key: ออกแบบ Cache Key ให้เหมาะสม เพื่อให้สามารถระบุข้อมูลที่ต้องการได้อย่างแม่นยำ
  • Cache Location: เลือกตำแหน่งที่เหมาะสมในการเก็บ Cache เช่น In-Memory, File System, Database

สรุป

Caching เป็นเทคนิคที่มีประสิทธิภาพในการเพิ่มประสิทธิภาพของ API โดยการเก็บข้อมูลที่ถูกเรียกใช้งานบ่อยๆ ไว้ในที่ที่เข้าถึงได้รวดเร็ว การเลือกประเภทของ Cache และการตั้งค่า Caching Strategy ที่เหมาะสมเป็นสิ่งสำคัญเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ในบทถัดไป เราจะเจาะลึกเรื่องการใช้ Redis เป็น Cache Server เพื่อเพิ่มความเร็วในการตอบสนองของ API ให้มากยิ่งขึ้นไปอีก

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る