Cache เป็นสิ่งที่เรามักได้ยินมันบ่อยๆ ในโลกของ Software อย่างที่รู้ๆ กันว่า ถ้าเราอยากให้การเรียกใช้งานข้อมูลเร็วขึ้น ก็ให้เอาข้อมูลนั้นไปเก็บไว้ใน cache ไม่ว่าจะเป็น text รูปภาพ หรือแม้กระทั่ง video
ผมก็เหมือนทุกคนที่รู้ว่า cache คืออะไร และมันใช้งานยังไง แต่เอาจริงๆ ผมก็ไม่ค่อยจำมันสักเท่าไหร่ รอบนี้เลยเอามาเขียนโน๊ตทิ้งไว้เหมือนเดิม
Cache คืออะไร
ถ้าจะให้อธิบาย cache แบบง่ายที่สุด โดยไม่ต้องแตะ technical เลย ก็ให้นึกถึงชีวิตจริงๆ คิดออกกันมั้ย งั้นลองดูตัวอย่างนี้กัน
สมมติว่า ในแต่ละวันเราต้องทำอาหารในทุกๆ เย็น ซึ่งอาหารที่เราทำนั้นมันต้องมีส่วนผสมต่างๆ อยู่แล้ว เช่น ผัก เนื้อสัตว์ เครื่องเทศ เครื่องปรุง เป็นต้น ซึ่งวัตถุดิบเหล่านี้เราสามารถหาซื้อได้ที่ตลาด หรือ ซุปเปอร์มาร์เก็ต ลองคิดดูว่า ถ้าในแต่ละวันเราต้องเดินทางไปซื้อวัถุดิบเหล่านี้ที่ตลาดทุกวัน มันจะเสียเวลามา เพราะระยะทางไกล ใช้เวลานาน และยุ่งยากในการซื้อ ต้องเลือก ต้องต่อราคา และปริมาณคนที่เยอะ เราเลยไม่ค่อยไปตลาดบ่อยๆ กัน ใช่ม่ะๆๆ
เพื่อที่จะลดความยุ่งยากเหล่านี้ลง เราก็ต้องหาอะไรที่ใช้ในการเก็บวัตถุดิบที่ซื้อมาจากตลาด มาไว้ใกล้ๆ ตัว เพื่อให้มันง่าย สะดวก และเร็วขึ้น สิ่งนั้น คือ ตู้เย็น นั้นเอง
![](https://nutshell.work/content/images/2024/07/1_gIdYbT5IAzg7XDg6qbUWpw.webp)
ทีนี้ เวลาที่เราทำอาหารเรา สิ่งที่เราจะทำก็ คือ เข้าไปดูของในตู้เย็นว่ามีไหม ถ้ามีก็เอามาทำอาหารได้เลย แต่ถ้าไป ก็ไปซื้อมาใหม่ที่ตลาด เท่านี้เราก็ลดความยุ่งยาก และลดเวลา ในการทำอาหารแล้ว
ตู้เย็น ก็คือ Caching นั่นเอง
จะเห็นได้ว่า ถ้าเราเอาแนวคิดนี้มาใช้งาน แสดงว่า หลายๆ อย่าง มันสามารถทำ cache ได้ และมันแทบจะอยู่ได้ในทุกๆ ที
แนวคิดหลักของ caching
ขึ้นอยู่กับ use case ที่ต้องการใช้งาน ยกตัวอย่างเช่น
- อยู่ตลอดไป
- มีอายุตามที่กำหนด (Expire time)
รวมทั้งยังต้องมีนโยบายของการลบข้อมูลทิ้ง เมื่อจำนวนพื้นที่ใช้งานเหลือน้อยหรือกำลังจะเต็ม มิเช่นนั้นระบบ caching อาจจะกลายเป็นปัญหาก็ได้ เช่น
- LRU (Least Recently Used) ข้อมูลชุดไหนที่ถูกใช้น้อย ๆ จะถูกลบไปก่อน
- LFU (Least Frequently Used) ข้อมูลชุดไหนที่ถูกแก้ไขน้อย ๆ จะถูกลบไปก่อน
- MRU (Most Recently Used) ข้อมูลที่มีอายุนาน และใช้น้อย ๆ จะถูกลบไปก่อน ไม่งั้นมันจะเน่า
โดยระบบ caching ต่าง ๆ ยังมีนโยบายอีกเพียบ เช่น Redis จะมี policy ในการใช้งานเหมือนกัน
ประเภทของการใช้งาน cache
เราจะเขียน caching ได้ 3 แบบหลักๆ โดยยกตัวอย่าง cache กับ database คือ
1. Write Through Cache
เป็นการบันทึกข้อมูลไปที่ระบบ caching ก่อน จากนั้นทำการบันทึกข้อมูลชุดเดียวกันไปยัง database หลัก ทำให้ข้อมูลทั้งสองที่ตรงกันเสมอ
![](https://nutshell.work/content/images/2024/07/2024-07-03-write-through-cache.png)
แต่ปัญหาหลักที่เห็นได้ชัดคือ latency time ที่สูงขึ้น
เพราะว่าต้องบันทึกข้อมูลทั้ง 2 ที่ จะไม่เหมาะกับระบบงานที่มีการเขียนข้อมูลเยอะๆ แต่จะเหมาะกับระบบที่มีการอ่านข้อมูลที่เขียนไปแล้วเยอะๆ และต้องการให้ข้อมูลตรงกันเสมอ
2. Write Back Cache
ทำขึ้นมาเพื่อช่วยแก้ไขปัญหาในระบบที่มีการเขียนสูงๆ ทำให้เราบันทึกข้อมูลไปยัง caching ก็พอจากนั้นทำการบันทึกข้อมูลที่ database แบบ asynchronous ต่อไป
![](https://nutshell.work/content/images/2024/07/2024-07-03-write-through-cache-1.png)
แต่ปัญหาที่ตามมาคือ จะมีช่วงเวลาที่ข้อมูลทั้งสองที่ไม่ตรงกัน (Data inconsistency) ยิ่งถ้าระบบงานส่วนอื่นๆ ต้องใช้ข้อมูลจาก database หลัก อาจจะทำให้เกิดปัญหาตามมาอีกเยอะเลย
3. Write Around Cache
ทำการบันทึกข้อมูลลง database หลักเลย ไม่ลง caching แต่ถ้ามีการอ่านข้อมูลจะอ่านข้อมูลจาก caching โดยครั้งแรกๆ จะไม่พบ (cache miss) ดังนั้นจึงต้องไปดึงข้อมูลจาก database มา แล้วทำการสร้างข้อมูลใน caching ขึ้นมาเรื่อย ๆ
![](https://nutshell.work/content/images/2024/07/2024-07-03-write-around-cache.png)
เมื่อไหร่ที่ต้องใช้ Cache
สิ่งที่ต้องควรพิจารณาของการนำ caching มาใช้
- การทำงานทั้ง read/write ว่าเป็นอย่างไร
- Storage รวมไปถึง database model ที่ใช้งาน
- การ sync ข้อมูล
- ความเร็วในการทำงาน
- Availability ของระบบ
- การ Scale
- Security
- Operation