Database
น้องๆ เคยเจอไหม database ทั่วไปมันช้าอืดอาด เวลาเราอยากได้อะไรที่มันซับซ้อนขึ้นมาหน่อย? Redis เนี่ยแหละคือทางออก! มันไม่ใช่แค่ key-value store ธรรมดาๆ แต่มี advanced data structures ให้เราเล่นเยอะแยะเลย
สมัยผมทำร้านเน็ต SiamCafe ช่วงปี 2000 กว่าๆ เนี่ย, เรื่อง cache นี่สำคัญสุดๆ เว็บไหนโหลดช้าคือเจ๊ง! Redis นี่เกิดมาเพื่อแก้ปัญหาพวกนี้แหละ มันช่วยให้เราเก็บข้อมูลที่ต้องการเข้าถึงบ่อยๆ ไว้ใน memory ได้อย่างมีประสิทธิภาพ, ทำให้เว็บเราตอบสนองไวเหมือนติดจรวด
Advanced data structures ใน Redis เนี่ย มันเหมือนเครื่องมือสารพัดประโยชน์ในกล่องเครื่องมือช่าง แต่ละอย่างก็มีหน้าที่เฉพาะของมัน รู้จักใช้ให้เป็น, ชีวิตการเขียนโปรแกรมจะง่ายขึ้นเยอะเลย
ง่ายๆ เลยนะน้อง, Key-Value store คือการที่เราเก็บข้อมูลเป็นคู่ๆ เหมือน dictionary เลย มีคำศัพท์ (key) แล้วก็มีคำแปล (value) Redis ก็เป็น key-value store ตัวนึง แต่พิเศษกว่าตรงที่ value มันไม่ใช่แค่ string ธรรมดา, มันเป็น data structure ต่างๆ ได้ด้วย
ก่อนจะไป advanced, ต้องรู้จักของพื้นฐานก่อน หลักๆ ก็มี Strings, Lists, Sets, Sorted Sets, Hashes พวกนี้แหละคือ building blocks สำคัญ
ลองนึกภาพตามนะ: Strings ก็เหมือนข้อความธรรมดา, Lists ก็เหมือน array, Sets ก็คือกลุ่มของข้อมูลที่ไม่ซ้ำกัน, Sorted Sets ก็คือ Sets ที่เรียงลำดับได้, และ Hashes ก็คือ object ที่มี field-value pairs
ติดตั้ง Redis ก็ง่ายมาก ถ้าใช้ Linux ก็แค่ sudo apt-get install redis-server หรือ sudo yum install redis ถ้าเป็น macOS ก็ brew install redis ง่ายๆ แค่นี้เอง
# ตัวอย่างการติดตั้ง Redis บน Ubuntu
sudo apt-get update
sudo apt-get install redis-server
พอลง Redis เสร็จแล้ว, ก็ลองรัน redis-cli ใน terminal ดู มันคือ command-line interface ที่เราใช้คุยกับ Redis server เหมือนเป็น console ที่เราพิมพ์คำสั่ง SQL ตอนใช้ database นั่นแหละ
การใช้งานก็ง่ายมาก SET key value คือการตั้งค่า, GET key คือการดึงค่า แค่นี้ก็เริ่มเล่น Redis ได้แล้ว
Bitmaps คือ array ของ bits แต่ละ bit ก็มีค่าเป็น 0 หรือ 1 เหมาะกับการเก็บข้อมูลประเภท flag หรือสถานะต่างๆ เช่น สถานะออนไลน์/ออฟไลน์ของผู้ใช้
# ตั้งค่า bit ที่ index 1000 เป็น 1
SETBIT online_users 1000 1
# ตรวจสอบค่าของ bit ที่ index 1000
GETBIT online_users 1000
# นับจำนวน bit ที่มีค่าเป็น 1
BITCOUNT online_users
สมัยผมทำร้านเน็ต, ผมใช้ bitmaps เก็บสถานะเครื่องคอมพิวเตอร์แต่ละเครื่อง เครื่องไหนเปิดอยู่ก็ set bit เป็น 1, เครื่องไหนปิดก็ set เป็น 0 ทำให้รู้ได้ทันทีว่าเครื่องไหนว่าง, ไม่ต้องเดินไปดูให้เสียเวลา
HyperLogLog คือ probabilistic data structure ที่ใช้ประมาณจำนวนสมาชิกที่ไม่ซ้ำกันใน set (cardinality estimation) ข้อดีคือใช้ memory น้อยมาก, ไม่ว่าจะเก็บข้อมูลเยอะแค่ไหนก็ใช้ memory นิดเดียว
# เพิ่มสมาชิกเข้าไปใน HyperLogLog
PFADD unique_users user1 user2 user3 user1
# ประมาณจำนวนสมาชิกที่ไม่ซ้ำกัน
PFCOUNT unique_users
ผมเคยเจอเคสที่ลูกค้าอยากรู้ว่ามีคนเข้าเว็บ SiamCafe Blog กี่คนต่อวัน แต่ database มันใหญ่มาก, การ query หา unique visitors นี่กิน resource มหาศาล HyperLogLog นี่แหละช่วยชีวิตไว้ คำนวณได้แม่นยำ แถมประหยัด resource ด้วย
อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะครับ มีเรื่อง IT สนุกๆ อีกเยอะเลย!
Geospatial Indexes คือ data structure ที่ใช้เก็บข้อมูลตำแหน่งทางภูมิศาสตร์ เช่น latitude, longitude ทำให้เราสามารถค้นหาข้อมูลที่อยู่ใกล้ๆ กันได้อย่างรวดเร็ว
# เพิ่มข้อมูลสถานที่
GEOADD places 13.7563 100.5018 "Siam Paragon"
GEOADD places 13.7467 100.5312 "CentralWorld"
# ค้นหาสถานที่ที่อยู่ใกล้กับ Siam Paragon ในรัศมี 1 กิโลเมตร
GEORADIUS places 13.7563 100.5018 1 km
ถ้าผมทำแอปหาร้านเน็ตใกล้บ้าน, ผมจะใช้ Geospatial Indexes นี่แหละ รับรองว่าลูกค้าหาร้านเน็ตเจอไวแน่นอน
Redis ไม่ใช่ database ตัวเดียวในโลก มันมีคู่แข่งเยอะแยะ แต่ละตัวก็มีข้อดีข้อเสียต่างกัน เราต้องเลือกให้เหมาะกับงาน
อย่าง Memcached ก็เป็น in-memory key-value store เหมือนกัน แต่ Redis มี advanced data structures ให้เล่นเยอะกว่า ส่วน MongoDB ก็เป็น NoSQL database ที่เก็บข้อมูลได้ซับซ้อนกว่า แต่ Redis เร็วกว่าเยอะ
| คุณสมบัติ | Redis | Memcached | MongoDB |
|---|---|---|---|
| Data Structures | Advanced | Simple | Complex |
| Persistence | Yes (RDB, AOF) | No | Yes |
| Use Cases | Caching, Session Management, Real-time Analytics | Caching | Document Storage |
เลือกใช้ Redis เมื่อต้องการความเร็ว, ความหลากหลายของ data structures, และความสามารถในการ persist ข้อมูล ถ้าต้องการแค่ cache อย่างเดียว, Memcached ก็อาจจะเพียงพอ แต่ถ้าต้องการเก็บข้อมูลที่ซับซ้อน, MongoDB อาจจะเป็นตัวเลือกที่ดีกว่า
ลองศึกษาดูให้ดีก่อนตัดสินใจ ไม่มีอะไรดีที่สุดสำหรับทุกงาน เลือกสิ่งที่เหมาะกับเราที่สุดครับ
อย่าลืมติดตาม SiamCafe Blog เพื่ออัพเดทความรู้ IT ใหม่ๆ นะครับ!
เอาล่ะ น้องๆ หลังจากที่เราคุยกันเรื่อง Redis Advanced Data Structures ไปแล้ว คราวนี้มาถึงเคล็ดลับที่ผมใช้จริงๆ ตอนทำร้านเน็ต SiamCafe สมัยก่อนนะ ยุคนั้น RAM แพงมากๆ การใช้ Redis เลยช่วยชีวิตไว้เยอะเลย
คือ Redis เนี่ยมันเก่งจริง แต่ถ้าใช้ไม่ถูกวิธี ก็อาจจะเจอปัญหาคอขวดได้เหมือนกัน คิดง่ายๆ เหมือนรถแข่งแรง แต่คนขับมือใหม่ ก็อาจจะเข้าโค้งคว่ำได้เหมือนกันแหละ
สมัยก่อนเว็บ SiamCafe เนี่ย เก็บ Session user ไว้ใน Cookie ธรรมดา พอ user เยอะๆ Server ก็อืดเป็นเรือเกลือ ผมเลยลองเปลี่ยนมาใช้ Redis Hash เก็บ Session แทน
วิธีคือ Gen UUID ให้ user แต่ละคน แล้วเอา UUID นั้นเป็น Key ใน Redis Hash ส่วน Value ก็เป็นข้อมูล user เช่น username, role, last_login อะไรพวกนี้
// PHP Example
$session_id = uniqid();
$user_data = [
'username' => 'bom',
'role' => 'admin',
'last_login' => time()
];
$redis->hmset("session:".$session_id, $user_data);
พอทำแบบนี้แล้ว Server โล่งขึ้นเยอะเลย เพราะไม่ต้องอ่าน Session จาก Disk ทุกครั้ง
เคยทำระบบ Ranking เกมออนไลน์เล็กๆ ในร้านเน็ต (ยุคนั้นเกม Counter Strike ฮิตมาก) ตอนแรกใช้ MySQL ก็โอเค แต่พอมี user เป็นหมื่น Performance เริ่มไม่ไหว
เลยลองเปลี่ยนมาใช้ Redis Sorted Set ปรากฏว่าแรงขึ้นผิดหูผิดตา วิธีก็ง่ายๆ เอาคะแนนเป็น Score แล้วเอา User ID เป็น Member
// PHP Example
$redis->zadd("ranking:cs", 1000, "user123"); // Add user123 with score 1000
$redis->zadd("ranking:cs", 1500, "user456"); // Add user456 with score 1500
$rank = $redis->zrevrank("ranking:cs", "user123"); // Get rank of user123
ข้อดีของ Sorted Set คือมัน Sort ให้เราอัตโนมัติ แถมยัง Get Rank ได้เร็วมากๆ
อันนี้เป็นข้อผิดพลาดที่ผมเคยเจอเอง คือตอนแรกคิดว่า Redis มันเร็ว จะเก็บอะไรเท่าไหร่ก็ได้ ปรากฏว่าไม่จริง! ถ้า Key นึงมีข้อมูลเยอะเกินไป (เช่น List ที่มีสมาชิกเป็นล้านๆ) การดึงข้อมูลจะช้าลงมากๆ
วิธีแก้คือ พยายามแบ่งข้อมูลออกเป็น Key ย่อยๆ แทน เช่น ถ้าจะเก็บ Log file ขนาดใหญ่ ก็อาจจะแบ่งเป็น Key ตามวัน หรือตามชั่วโมง
Redis เหมาะกับงานที่ต้องการความเร็วสูง และข้อมูลเปลี่ยนแปลงบ่อยๆ เช่น Caching, Session Management, Real-time analytics, Leaderboard, Message Queue
Redis เป็น In-memory data store คือข้อมูลส่วนใหญ่อยู่ใน RAM ทำให้เร็วกว่า MySQL ที่เก็บข้อมูลใน Disk แต่ Redis ไม่เหมาะกับการเก็บข้อมูลสำคัญที่ต้อง Transactional หรือข้อมูลที่มีความสัมพันธ์ซับซ้อน
Redis มีระบบ Persistence ที่สามารถ Save ข้อมูลลง Disk ได้ 2 แบบคือ RDB (Snapshot) และ AOF (Append Only File) แต่ถ้า Server ไฟดับระหว่างที่ Redis กำลังเขียนข้อมูล ก็อาจจะมีข้อมูลหายได้บ้าง
Redis สามารถ Scale ได้ 2 แบบคือ Vertical Scaling (เพิ่ม RAM ให้ Server) และ Horizontal Scaling (ใช้ Redis Cluster เพื่อกระจายข้อมูลไปหลายๆ Server)
Redis Advanced Data Structures เนี่ยเป็นเครื่องมือที่ทรงพลังมากๆ ถ้าเราเข้าใจหลักการทำงานของมัน และเลือกใช้ให้เหมาะสมกับงาน ก็จะช่วยเพิ่ม Performance ให้ Application ของเราได้อย่างมหาศาล
แต่ที่สำคัญที่สุดคือ ต้องลองผิดลองถูก ลองทำจริงๆ แล้วจะเข้าใจเองครับ เหมือนสมัยผมทำร้านเน็ต SiamCafe นั่นแหละ SiamCafe Blog นี่ก็มีเรื่องเล่าสมัยนั้นเยอะเลย ลองไปอ่านดูได้นะ
อ้อ แล้วถ้าใครสนใจเรื่อง Forex ลองเข้าไปดูที่ iCafeForex ได้นะ