Redis Cache คืออะไร? ทำไมถึงสำคัญต่อแอปพลิเคชัน
ในโลกของการพัฒนาเว็บแอปพลิเคชัน ประสิทธิภาพและความเร็วในการตอบสนองเป็นสิ่งสำคัญอย่างยิ่ง ผู้ใช้งานคาดหวังว่าจะได้รับประสบการณ์ที่ราบรื่นและรวดเร็ว หากแอปพลิเคชันของคุณโหลดช้าหรือตอบสนองช้า อาจส่งผลเสียต่อความพึงพอใจของผู้ใช้งานและอาจทำให้เสียโอกาสทางธุรกิจได้
หนึ่งในเทคนิคที่สำคัญในการเพิ่มประสิทธิภาพของแอปพลิเคชันคือการใช้ Cache และ Redis ก็เป็นเครื่องมือที่ได้รับความนิยมอย่างมากในการทำ Cache
Cache คืออะไร?
Cache คือกลไกในการจัดเก็บสำเนาของข้อมูลที่ถูกเข้าถึงบ่อยๆ ไว้ในตำแหน่งที่เข้าถึงได้รวดเร็วกว่าแหล่งข้อมูลหลัก เมื่อแอปพลิเคชันต้องการข้อมูล แทนที่จะไปดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล) ก็จะตรวจสอบใน Cache ก่อน ถ้าพบข้อมูลที่ต้องการใน Cache (Cache Hit) ก็จะนำข้อมูลนั้นมาใช้ได้เลย ทำให้ลดเวลาในการเข้าถึงข้อมูลและลดภาระของแหล่งข้อมูลหลัก
ลองนึกภาพว่าคุณต้องการค้นหาคำศัพท์ในพจนานุกรม ถ้าคุณต้องพลิกหน้าพจนานุกรมทุกครั้งที่ต้องการค้นหาคำศัพท์ใหม่ จะเสียเวลามาก แต่ถ้าคุณจดคำศัพท์ที่คุณค้นหาบ่อยๆ ไว้ในสมุดโน้ตเล่มเล็กๆ คุณก็จะสามารถค้นหาคำศัพท์เหล่านั้นได้อย่างรวดเร็ว นี่คือหลักการทำงานของ Cache
มี Cache หลายประเภทที่สามารถนำมาใช้ในแอปพลิเคชันได้ เช่น:
- Browser Cache: จัดเก็บไฟล์ static เช่น รูปภาพ, CSS, JavaScript ไว้ใน Browser ของผู้ใช้งาน เพื่อลดการดาวน์โหลดไฟล์ซ้ำ
- Server-side Cache: จัดเก็บข้อมูลที่ถูกประมวลผลแล้วไว้ใน Server เพื่อลดการประมวลผลซ้ำ
- Database Cache: จัดเก็บผลลัพธ์ของการ query ฐานข้อมูลไว้ใน Cache เพื่อลดการ query ฐานข้อมูลซ้ำ
Redis คืออะไร?
Redis (Remote Dictionary Server) คือ In-Memory Data Structure Store ที่สามารถใช้เป็นฐานข้อมูล, Cache, message broker และ stream engine ได้ Redis เป็น Open Source และมีประสิทธิภาพสูงมาก เนื่องจากข้อมูลถูกจัดเก็บไว้ในหน่วยความจำ (RAM) ทำให้การเข้าถึงข้อมูลรวดเร็วกว่าการเข้าถึงข้อมูลจาก Disk (เช่น ในฐานข้อมูลแบบดั้งเดิม)
Redis รองรับ data structure ที่หลากหลาย เช่น:
- Strings: ข้อความทั่วไป
- Hashes: คล้ายกับ associative array หรือ dictionary
- Lists: คล้ายกับ array ที่สามารถเพิ่มและลบข้อมูลจากหัวและท้าย List ได้
- Sets: คล้ายกับ array ที่ไม่มีข้อมูลซ้ำ
- Sorted Sets: คล้ายกับ Set แต่ข้อมูลถูกเรียงลำดับตาม Score
ความยืดหยุ่นของ data structure เหล่านี้ทำให้ Redis เหมาะสมกับการใช้งานที่หลากหลาย นอกเหนือจากการเป็น Cache Server
ข้อดีของการใช้ Redis Cache
การใช้ Redis Cache มีข้อดีมากมาย ดังนี้:
- ประสิทธิภาพสูง: เนื่องจาก Redis ทำงานในหน่วยความจำ การเข้าถึงข้อมูลจึงรวดเร็วกว่าการเข้าถึงข้อมูลจาก Disk มาก ทำให้แอปพลิเคชันตอบสนองได้รวดเร็วขึ้น
- ลดภาระของฐานข้อมูล: เมื่อข้อมูลถูก Cache ไว้ใน Redis แอปพลิเคชันจะไม่ต้อง query ฐานข้อมูลบ่อยๆ ทำให้ลดภาระของฐานข้อมูลและเพิ่ม scalability
- Scalability: Redis สามารถ Scale ได้ทั้งในแนวตั้ง (เพิ่ม RAM ให้กับ Server) และแนวนอน (ใช้ Redis Cluster เพื่อกระจายข้อมูลไปยังหลาย Server)
- ความยืดหยุ่น: Redis รองรับ data structure ที่หลากหลาย ทำให้สามารถนำไปใช้ใน Use case ที่หลากหลายได้
- ใช้งานง่าย: Redis มี API ที่ใช้งานง่าย และมี Client Library ให้ใช้งานในหลายภาษา programming
- Open Source: Redis เป็น Open Source ทำให้ไม่มีค่าใช้จ่ายในการใช้งาน และมี Community ที่แข็งแกร่ง
Use case ที่เหมาะสม
Redis Cache เหมาะสมกับ Use case ที่ต้องการความเร็วในการเข้าถึงข้อมูลสูง และข้อมูลมีการเปลี่ยนแปลงไม่บ่อยนัก ตัวอย่าง Use case ที่เหมาะสม:
- Caching ข้อมูลจากฐานข้อมูล: Cache ผลลัพธ์ของการ query ฐานข้อมูลที่ใช้บ่อยๆ เช่น ข้อมูลผู้ใช้งาน, ข้อมูลสินค้า
- Caching session data: จัดเก็บ session data ของผู้ใช้งานไว้ใน Redis เพื่อให้สามารถเข้าถึง session data ได้อย่างรวดเร็ว
- Caching API responses: Cache ผลลัพธ์ของการเรียก API เพื่อลดภาระของ API Server
- Rate limiting: จำกัดจำนวนครั้งที่ผู้ใช้งานสามารถเข้าถึง API หรือ Resource อื่นๆ ได้
- Real-time analytics: ใช้ Redis เพื่อเก็บข้อมูล analytics แบบ Real-time เช่น จำนวนผู้ใช้งานที่ออนไลน์, จำนวนการเข้าชมหน้าเว็บ
- Message queue: ใช้ Redis เป็น message queue เพื่อส่งข้อความระหว่าง components ต่างๆ ของแอปพลิเคชัน
ตัวอย่าง: Caching ข้อมูลผู้ใช้งาน
สมมติว่าคุณมีเว็บไซต์ที่มีข้อมูลผู้ใช้งานจำนวนมาก และผู้ใช้งานต้อง Login เข้าสู่ระบบบ่อยๆ การ query ข้อมูลผู้ใช้งานจากฐานข้อมูลทุกครั้งที่ผู้ใช้งาน Login จะทำให้ฐานข้อมูลมีภาระมาก คุณสามารถใช้ Redis Cache เพื่อ Cache ข้อมูลผู้ใช้งานได้ดังนี้:
- เมื่อผู้ใช้งาน Login ให้ query ข้อมูลผู้ใช้งานจากฐานข้อมูล
- นำข้อมูลผู้ใช้งานที่ได้มาเก็บไว้ใน Redis โดยใช้ user ID เป็น key
- ครั้งต่อไปที่ผู้ใช้งาน Login ให้ตรวจสอบใน Redis ก่อน ถ้าพบข้อมูลผู้ใช้งานใน Redis (Cache Hit) ก็ให้นำข้อมูลนั้นมาใช้ได้เลย
- ถ้าไม่พบข้อมูลผู้ใช้งานใน Redis (Cache Miss) ให้ query ข้อมูลจากฐานข้อมูล แล้วนำข้อมูลที่ได้มาเก็บไว้ใน Redis เพื่อใช้ในอนาคต
ตัวอย่างโค้ด PHP (อย่างง่าย)
<?php
// เชื่อมต่อกับ Redis Server
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$userId = 123;
$userKey = 'user:' . $userId;
// ตรวจสอบว่ามีข้อมูลผู้ใช้งานใน Redis หรือไม่
if ($redis->exists($userKey)) {
// Cache Hit: ดึงข้อมูลจาก Redis
$userData = json_decode($redis->get($userKey), true);
echo "ข้อมูลผู้ใช้งานจาก Redis: \n";
print_r($userData);
} else {
// Cache Miss: ดึงข้อมูลจากฐานข้อมูล
// (สมมติว่ามีฟังก์ชัน getUserFromDatabase($userId) ที่ดึงข้อมูลจากฐานข้อมูล)
$userData = getUserFromDatabase($userId);
// เก็บข้อมูลผู้ใช้งานไว้ใน Redis (หมดอายุใน 30 นาที)
$redis->setex($userKey, 1800, json_encode($userData));
echo "ข้อมูลผู้ใช้งานจากฐานข้อมูล: \n";
print_r($userData);
}
?>
โค้ดนี้เป็นตัวอย่างง่ายๆ แสดงให้เห็นถึงหลักการทำงานของการใช้ Redis Cache ใน PHP คุณจะต้องปรับแก้โค้ดให้เหมาะสมกับโครงสร้างแอปพลิเคชันของคุณ
ในบทความถัดไป เราจะมาเรียนรู้วิธีการติดตั้งและตั้งค่า Redis บน Ubuntu