Redis Caching Strategies Database

Redis Caching Strategies

📅 2026-02-09 | โดย อ.บอม กิตติทัศน์ เจริญพนาสิทธิ์ — SiamCafe.net Since 1997

Redis Caching Strategies คืออะไร / ทำไมถึงสำคัญ

น้องๆ เคยไหม? เว็บโหลดช้าอืดเป็นเรือเกลือ กดอะไรก็รอๆๆ สมัยผมทำร้านเน็ตนี่เรื่องใหญ่เลยนะ ลูกค้าหายหมด! Redis caching strategies เนี่ยแหละ คือพระเอกที่จะมาช่วยให้เว็บเราเร็วปรื๊ดเหมือนติดจรวด

Caching คือการเอาข้อมูลที่เราใช้บ่อยๆ ไปเก็บไว้ในที่ที่มันเข้าถึงได้เร็วกว่าเดิม เหมือนเราเอาของใช้ประจำวันไว้ใกล้มือ จะหยิบจับอะไรก็ง่ายไง Redis เนี่ย มันเป็น in-memory data store คือเก็บข้อมูลไว้ใน RAM ทำให้มันเร็วกว่าการไปดึงข้อมูลจาก database แบบเดิมๆ มากกกก

ทำไมมันถึงสำคัญ? ก็เพราะว่ามันช่วยลดโหลดให้ database หลักของเราไง สมมติมีคนเข้ามาดูสินค้าตัวนึงพร้อมๆ กันเป็นร้อยเป็นพันคน ถ้าเราต้องไปดึงข้อมูลจาก database ทุกครั้ง database เราก็อาจจะน็อคได้ แต่ถ้าเรามี Redis cache คอยช่วย ข้อมูลก็จะถูกส่งไปให้ user ได้อย่างรวดเร็ว ลดภาระของ database ไปเยอะเลย

พื้นฐานที่ต้องรู้

Cache-Aside

อันนี้เป็น strategy ที่เบสิคสุดๆ หลักการคือ ถ้าเราต้องการข้อมูลอะไร ให้เราไปเช็คใน cache ก่อน ถ้ามี (cache hit) ก็เอาข้อมูลจาก cache มาใช้ได้เลย แต่ถ้าไม่มี (cache miss) ค่อยไปดึงข้อมูลจาก database แล้วเอามาใส่ใน cache ไว้ด้วย คราวหน้าจะได้ไม่ต้องไปดึงจาก database อีก

สมัยผมทำร้านเน็ต เคยเจอเคสนี้เลย ลูกค้าเข้าร้านมาพร้อมกันเยอะๆ แล้วจะเล่นเกมเดียวกัน ปรากฏว่า server ล่มเพราะ database รับโหลดไม่ไหว Cache-Aside นี่แหละช่วยชีวิตไว้ได้ทัน

Read-Through / Write-Through

สองอันนี้จะซับซ้อนขึ้นมาหน่อย Read-Through คือ cache จะทำหน้าที่เหมือนเป็น proxy ให้กับ database เวลาเราต้องการข้อมูลอะไร เราจะไปคุยกับ cache ก่อน ถ้า cache ไม่มีข้อมูล มันจะไปดึงข้อมูลจาก database มาให้เราเอง แล้วก็เก็บข้อมูลนั้นไว้ใน cache ด้วย

Write-Through ก็คล้ายๆ กัน แต่เวลาเราจะเขียนข้อมูลอะไร เราจะเขียนไปที่ cache ก่อน แล้ว cache จะไปเขียนข้อมูลนั้นลงใน database ให้อีกที ข้อดีคือข้อมูลใน cache กับ database จะ sync กันเสมอ

Cache Invalidation

สำคัญมากๆ! คือการทำให้ข้อมูลใน cache เป็นปัจจุบันอยู่เสมอ เพราะถ้าข้อมูลใน cache ไม่ตรงกับข้อมูลใน database ก็จะเกิดปัญหาข้อมูลผิดพลาดได้ วิธีการก็คือ เมื่อข้อมูลใน database มีการเปลี่ยนแปลง เราจะต้องทำการ invalidate (ลบ) ข้อมูลนั้นออกจาก cache เพื่อให้ครั้งต่อไปเวลาเราต้องการข้อมูลนั้น เราจะได้ไปดึงข้อมูลที่ถูกต้องจาก database มาใส่ใน cache ใหม่

วิธีใช้งาน / เริ่มต้นยังไง

Redis เนี่ย ใช้งานง่ายมากๆ มี client library ให้เลือกใช้เยอะแยะ ไม่ว่าจะเป็น PHP, Python, Node.js หรือภาษาอื่นๆ ที่น้องๆ ถนัดเลย

เริ่มต้นก็แค่ติดตั้ง Redis server แล้วก็ import library ที่เราต้องการ จากนั้นก็ connect ไปที่ Redis server แล้วก็เริ่มใช้งานได้เลย

ขั้นตอนปฏิบัติจริง

ติดตั้ง Redis Server

อันนี้แล้วแต่ OS ที่น้องๆ ใช้นะ ถ้าเป็น Linux ก็ใช้ package manager ได้เลย เช่น apt-get install redis-server หรือ yum install redis ถ้าเป็น Windows ก็โหลด installer มาติดตั้งได้เลย

เขียน Code เชื่อมต่อ Redis

ตัวอย่างโค้ด Python:


import redis

# Connect to Redis server
r = redis.Redis(host='localhost', port=6379, db=0)

# Set a key-value pair
r.set('mykey', 'myvalue')

# Get the value of a key
value = r.get('mykey')
print(value) # Output: b'myvalue'

โค้ดนี้ง่ายๆ เลยนะ แค่ connect ไปที่ Redis server แล้วก็ set ค่า key-value pair แล้วก็ get ค่าออกมา

Implement Cache-Aside

ตัวอย่างการ implement Cache-Aside ใน Python:


def get_data_from_cache_or_db(key):
  # Try to get data from cache
  value = r.get(key)

  if value:
    # Cache hit!
    print("Data from cache")
    return value.decode('utf-8') # Decode from bytes

  else:
    # Cache miss!
    print("Data from database")
    # Get data from database (replace with your actual database query)
    value = get_data_from_database(key)

    # Store data in cache
    r.set(key, value)

    return value

def get_data_from_database(key):
  # Replace this with your actual database query
  # For example:
  # cursor.execute("SELECT value FROM mytable WHERE key = %s", (key,))
  # result = cursor.fetchone()
  # return result[0] if result else None
  return "Data from database for key: " + key # Simulate database call

อันนี้เป็นตัวอย่างง่ายๆ นะ น้องๆ ต้องเอาไปปรับใช้กับ code ของตัวเองอีกที หลักการคือ เราจะเช็คใน cache ก่อน ถ้าไม่มีค่อยไปดึงจาก database แล้วเอามาใส่ใน cache ไว้

เปรียบเทียบกับทางเลือกอื่น

Redis ไม่ใช่ caching solution ตัวเดียวในโลกนะ ยังมี Memcached, Varnish Cache, หรือแม้กระทั่ง HTTP Cache ที่ browser เราใช้กันอยู่ แต่ละตัวก็มีข้อดีข้อเสียต่างกัน

Memcached จะเน้นไปที่ความเร็วและความเรียบง่าย แต่ Redis จะมี feature เยอะกว่า เช่น data structures ที่หลากหลาย, persistence, pub/sub อะไรพวกนี้ Varnish Cache จะเหมาะกับการ caching HTTP content เช่น รูปภาพ, CSS, JavaScript ส่วน HTTP Cache ก็เป็นอะไรที่เบสิคที่สุด แต่ก็ช่วยลดโหลดให้ server เราได้ในระดับนึง

สมัยผมทำร้านเน็ต ก็เคยลองใช้หลายๆ ตัวนะ สุดท้ายก็มาจบที่ Redis เพราะมันยืดหยุ่นและตอบโจทย์เราได้มากที่สุด SiamCafe Blog ก็ใช้ Redis นะ ลองเข้าไปดูได้

Solution ข้อดี ข้อเสีย เหมาะกับ
Redis เร็ว, data structures หลากหลาย, persistence, pub/sub config ซับซ้อนกว่า Memcached Caching ทั่วไป, session management, real-time analytics
Memcached เร็วมาก, ใช้งานง่าย feature น้อยกว่า Redis, ไม่มีการ persistence Caching object ขนาดเล็ก
Varnish Cache Caching HTTP content ได้ดีมาก config ซับซ้อน Caching website ที่มี traffic สูง
HTTP Cache ใช้งานง่าย, built-in ใน browser ควบคุมได้น้อย Caching static content เช่น รูปภาพ, CSS, JavaScript

เลือกใช้ตัวไหน ก็ขึ้นอยู่กับ requirement ของโปรเจกต์เรานะ ลองศึกษาดูดีๆ ก่อนตัดสินใจ SiamCafe Blog มีบทความเกี่ยวกับ caching อีกเยอะเลย ลองเข้าไปอ่านดูได้

🎬 วิดีโอแนะนำ

ดูวิดีโอเพิ่มเติมเกี่ยวกับRedis Caching Strategies:

Best Practices / เคล็ดลับจากประสบการณ์

น้องๆ หลายคนอาจจะมองว่า Redis Caching มันง่าย แค่เอาข้อมูลใส่ๆ ถ่ายๆ แต่จริงๆ แล้วมันมีอะไรมากกว่านั้นเยอะ สมัยผมทำร้านเน็ต SiamCafe เนี่ย เจอปัญหามาเยอะแยะ เลยอยากจะแชร์เคล็ดลับที่ผมใช้จริง ให้เอาไปปรับใช้กันได้

จำไว้เลยว่า Caching ไม่ใช่ยาวิเศษ มันแก้ปัญหาได้ แต่ก็สร้างปัญหาใหม่ได้เหมือนกัน ถ้าเราไม่เข้าใจมันจริงๆ

เทคนิคที่ 1: Cache Invalidation Strategy ที่เหมาะสม

เรื่องสำคัญที่สุดคือ Cache Invalidation หรือการทำให้ Cache หมดอายุ สมัยก่อนผมใช้ TTL (Time-To-Live) แบบง่ายๆ คือตั้งเวลาไว้เลย เช่น ข้อมูลนี้เก็บไว้ 1 ชั่วโมง แล้วค่อยไปดึงใหม่

แต่ปัญหาคือ ข้อมูลบางอย่างมันเปลี่ยนบ่อยกว่านั้น หรือบางอย่างมันแทบจะไม่เปลี่ยนเลย การตั้ง TTL แบบตายตัวมันไม่ค่อยเวิร์คเท่าไหร่

ลองพิจารณาใช้ Cache Invalidation แบบ Event-Based ดูสิ เช่น ถ้ามีข้อมูลใน Database เปลี่ยนแปลง เราก็ส่ง Event ไปบอก Redis ให้ลบ Cache ตัวนั้นทิ้งซะ วิธีนี้จะทำให้ Cache ของเราสดใหม่เสมอ SiamCafe Blog มีบทความเรื่องนี้ละเอียดเลย

เทคนิคที่ 2: Cache-Aside Pattern

อันนี้เป็น Pattern ที่ผมชอบใช้มากที่สุด คือเวลา Application ต้องการข้อมูล มันจะไปเช็คใน Cache ก่อน ถ้ามีข้อมูลก็เอามาใช้เลย (Cache Hit) ถ้าไม่มี (Cache Miss) ก็ค่อยไปดึงจาก Database แล้วเอามาใส่ใน Cache

ข้อดีคือ Database ของเราจะไม่โดนโหลดหนักเกินไป เพราะส่วนใหญ่ Application จะดึงข้อมูลจาก Cache เป็นหลัก


def get_data(key):
  data = redis.get(key)
  if data:
    return data
  else:
    data = database.get(key)
    redis.set(key, data, ex=3600) # เก็บไว้ใน Cache 1 ชั่วโมง
    return data

เทคนิคที่ 3: ใช้ Redis Cluster สำหรับ Scale

ถ้า Application ของเราเริ่มมีคนใช้เยอะๆ Redis ตัวเดียวอาจจะไม่พอ เราต้อง Scale Out โดยการใช้ Redis Cluster

Redis Cluster จะช่วยกระจายข้อมูล Cache ไปยังหลายๆ Node ทำให้เราสามารถรองรับ Traffic ได้มากขึ้น และยังช่วยเพิ่ม High Availability ด้วย ถ้า Node นึงเสีย Node อื่นๆ ก็ยังทำงานต่อได้

เทคนิคที่ 4: Monitor Cache Performance อย่างสม่ำเสมอ

อย่าลืม Monitor Cache Performance ด้วยนะ ดูว่า Cache Hit Rate เป็นยังไง Cache Miss Rate เป็นยังไง Latency เท่าไหร่ ถ้า Cache Hit Rate ต่ำ แสดงว่า Cache ของเราอาจจะไม่ค่อยมีประโยชน์เท่าไหร่ ต้องปรับปรุง

ผมแนะนำให้ใช้ Tools อย่าง RedisInsight หรือ Prometheus + Grafana ในการ Monitor Redis

FAQ คำถามที่พบบ่อย

ทำไม Cache Hit Rate ของผมมันต่ำจัง?

Cache Hit Rate ต่ำอาจเกิดได้จากหลายสาเหตุ เช่น Cache Invalidation Strategy ไม่ดี TTL สั้นเกินไป หรือ Cache Size เล็กเกินไป ลองปรับ Parameters เหล่านี้ดู

Redis เหมาะกับข้อมูลแบบไหน?

Redis เหมาะกับข้อมูลที่อ่านบ่อย เขียนไม่บ่อย และต้องการความเร็วสูง เช่น Session Data, User Profile, Product Catalog

ควรตั้ง TTL นานแค่ไหน?

TTL ขึ้นอยู่กับลักษณะของข้อมูล ถ้าข้อมูลเปลี่ยนแปลงบ่อยก็ตั้ง TTL สั้นหน่อย ถ้าข้อมูลไม่ค่อยเปลี่ยนก็ตั้ง TTL นานหน่อย ลอง Experiment ดูว่าค่าไหนเหมาะสมที่สุด

Redis กับ Memcached ต่างกันยังไง?

Redis มี Data Structure ที่หลากหลายกว่า Memcached เช่น List, Set, Hash และมี Features มากกว่า เช่น Persistence, Pub/Sub, Transactions iCafeForex ก็เคยใช้ทั้งคู่ แต่สุดท้ายก็เลือก Redis เพราะมันยืดหยุ่นกว่า

สรุป

Redis Caching เป็นเครื่องมือที่ทรงพลัง แต่ต้องใช้ให้ถูกวิธี หวังว่าเคล็ดลับที่ผมแชร์ไป จะเป็นประโยชน์กับน้องๆ นะครับ อย่าลืม Monitor Performance อย่างสม่ำเสมอ และปรับแต่ง Parameters ให้เหมาะสมกับ Application ของเรา