Database
น้องๆ เคยสงสัยไหมว่าทำไมเวลาเข้าเว็บเดิมซ้ำๆ มันถึงโหลดเร็วกว่าครั้งแรก? นั่นแหละครับคือเสน่ห์ของการทำ Caching! สมัยผมทำร้านเน็ต SiamCafe (ย้อนไป 20 กว่าปีก่อน) Server นี่สเปคไม่ได้แรงเหมือนสมัยนี้ การทำ Cache เลยเป็นเรื่องสำคัญมาก เพราะมันช่วยลดโหลดของ Server หลักได้เยอะเลย
Caching คือการเอาข้อมูลที่ถูกเรียกใช้งานบ่อยๆ ไปเก็บไว้ในที่ที่เข้าถึงได้เร็วกว่า เช่น RAM แทนที่จะต้องไปดึงจาก Database ทุกครั้ง ก็ไปเอาจาก Cache แทน ทำให้เว็บหรือแอปเราตอบสนองได้ไวขึ้น User ก็แฮปปี้ขึ้นเยอะ
ก่อนจะไปลงมือทำ Cache จริงๆ เราต้องเข้าใจ Concept พื้นฐานพวกนี้ก่อนนะ
น้องลองนึกภาพว่าเราจะส่งของขวัญให้เพื่อน แต่ของขวัญเรามันใหญ่เกินกว่ากล่องปกติ เราก็ต้องหาวิธีแพ็คให้มันเล็กลงก่อน เช่น ถอดชิ้นส่วน หรือบีบอัด Data Serialization ก็คล้ายๆ กันครับ เราต้องแปลง Data ให้อยู่ใน Format ที่เหมาะสมก่อนที่จะเอาไปใส่ใน Cache
Redis กับ Memcached เป็น In-Memory Data Stores ที่นิยมใช้ทำ Cache ทั้งคู่ แต่ก็มีข้อแตกต่างกันอยู่บ้าง เดี๋ยวเรามาดูกันว่าเริ่มต้นใช้งานยังไง
Redis ไม่ได้เป็นแค่ Cache แต่มันเป็น In-Memory Data Structure Store ที่รองรับ Data Structures หลายแบบ เช่น Strings, Hashes, Lists, Sets, Sorted Sets ทำให้เราเอาไปประยุกต์ใช้ได้หลากหลายกว่าแค่ Cache
sudo apt-get install redis-serverredis-py ใน Python)import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('mykey', 'myvalue')value = r.get('mykey')
print(value) # Output: b'myvalue'Memcached ถูกออกแบบมาให้เป็น Distributed Memory Object Caching System จุดเด่นคือความเร็วในการเข้าถึงข้อมูลและการจัดการ Memory ที่มีประสิทธิภาพ
sudo apt-get install memcachedpython-memcached ใน Python)import memcache
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
mc.set("mykey", "myvalue")value = mc.get("mykey")
print(value) # Output: myvalueอย่าลืมไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะครับ มีเรื่อง IT อีกเยอะแยะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับCaching Strategies Redis Memcached:
ทั้ง Redis และ Memcached ต่างก็มีข้อดีข้อเสียแตกต่างกันไป ไม่มีตัวไหนที่ดีที่สุดเสมอไป ขึ้นอยู่กับ Use Case ของเรา
| คุณสมบัติ | Redis | Memcached |
|---|---|---|
| Data Structures | หลากหลาย (Strings, Hashes, Lists, Sets, Sorted Sets) | Simple Key-Value |
| Persistence | รองรับ (RDB, AOF) | ไม่รองรับ (In-Memory Only) |
| Use Cases | Caching, Message Queue, Session Management, Leaderboard | Caching (เน้นความเร็ว) |
| Complexity | สูงกว่า | ต่ำกว่า |
นอกจาก Redis และ Memcached ก็ยังมีตัวเลือกอื่นๆ อีก เช่น
การเลือกใช้ Caching Solution ที่เหมาะสมขึ้นอยู่กับหลายปัจจัย เช่น ประเภทของข้อมูลที่เราต้องการ Cache, Scale ของระบบ, และความต้องการด้าน Performance ลองศึกษาข้อมูลเพิ่มเติมและเลือกใช้ให้เหมาะสมกับโปรเจกต์ของเรานะครับ
ถ้าอยากรู้เรื่อง IT เจ๋งๆ อีก อย่าลืมแวะไปที่ SiamCafe Blog บ่อยๆ นะครับ ผมเขียนเองกับมือเลย
เอาล่ะน้อง สมัยผมทำร้านเน็ต SiamCafe เนี่ย เจอปัญหา cache เต็มบ่อยมาก เพราะเด็กมันโหลดบิทกันทั้งวัน (ฮา) เลยต้องหาทางจัดการให้ดี ไม่งั้นเครื่องลูกค้าง ร้านเจ๊งนะบอกเลย
Caching เนี่ยเหมือนมีผู้ช่วยส่วนตัวที่คอยจำข้อมูลที่เราใช้บ่อยๆ ไว้ พอเราเรียกใช้ซ้ำมันก็เอามาให้เลย ไม่ต้องไปค้นหาใหม่จาก Database ให้เสียเวลา แต่ถ้าใช้ไม่เป็น แทนที่จะเร็ว กลับกลายเป็นช้ากว่าเดิมอีกนะ
// โค้ดตัวอย่างแบบ pseudo-code นะน้อง
function getData(key) {
data = Cache.get(key);
if (data == null) {
data = Database.get(key);
Cache.set(key, data);
}
return data;
}
สมัยผมใช้ Memcached ก็ประมาณนี้แหละ ง่ายดี
แต่ข้อเสียคือเขียนช้าลงนิดนึง ต้อง trade-off กันไป
วิธีที่นิยมใช้คือ Time-To-Live (TTL) ตั้งเวลาให้ Cache หมดอายุเอง หรือใช้ Message Queue แจ้งเตือนให้ Cache อัพเดท
อันนี้เหมาะกับ application ใหญ่ๆ ที่มีข้อมูลเยอะๆ
จำไว้ว่า ไม่มีสูตรสำเร็จตายตัว ต้องลองปรับใช้ให้เข้ากับ application ของตัวเองนะน้อง
Redis เหนือกว่า Memcached ตรงที่มันเก็บข้อมูลได้หลายแบบ (String, List, Set, Hash) และมี feature เยอะกว่า แต่ถ้าต้องการแค่ Cache ข้อมูลแบบง่ายๆ Memcached ก็ยังเป็นตัวเลือกที่ดีและเร็วกว่า
สมัยผมเริ่มทำร้านเน็ต Memcached นี่แหละตอบโจทย์สุดๆ
อย่างแรกคือ Monitor Cache usage ให้ดีๆ ถ้า Cache เต็มบ่อยๆ อาจจะต้องเพิ่มขนาด Cache หรือปรับ TTL ให้สั้นลง
อีกวิธีคือใช้ Eviction policy เช่น Least Recently Used (LRU) ให้ Cache ลบข้อมูลที่ไม่ได้ใช้มานานออกไปก่อน
ไม่แนะนำอย่างยิ่ง! ถ้าจำเป็นต้อง Cache ข้อมูล Sensitive จริงๆ ต้อง encrypt ข้อมูลก่อน และจำกัดสิทธิ์การเข้าถึง Cache ให้เข้มงวด
แต่ทางที่ดีที่สุดคือหลีกเลี่ยงการ Cache ข้อมูล Sensitive ไปเลย
Cache Stampede คือสถานการณ์ที่ Cache หมดอายุพร้อมๆ กัน ทำให้ request จำนวนมากแห่กันไปดึงข้อมูลจาก Database ทำให้ Database ล่มได้
วิธีแก้คือใช้ Cache Locking ให้ request แรกดึงข้อมูลจาก Database แล้วเขียนลง Cache ส่วน request อื่นๆ ให้รอ request แรกทำเสร็จ หรือใช้ Staggered Expiry ตั้งเวลาหมดอายุของ Cache แต่ละรายการให้ต่างกัน
Caching เป็นเครื่องมือที่ทรงพลัง แต่ต้องใช้ให้ถูกวิธี ไม่งั้นแทนที่จะช่วยให้ application เร็วขึ้น กลับกลายเป็นสร้างปัญหาให้ปวดหัวกว่าเดิมอีก
จำไว้ว่าต้อง Monitor Cache usage อย่างสม่ำเสมอ ปรับแต่ง configuration ให้เหมาะสม และที่สำคัญที่สุดคือต้องเข้าใจ business requirement ของตัวเอง
ขอให้สนุกกับการทำ Caching นะน้อง! iCafeForex เผื่อใครสนใจลงทุน
แวะมาอ่านบทความอื่นๆ เพิ่มเติมได้ที่ SiamCafe Blog นะครับ