ข้ามไปยังเนื้อหา

Persistence & Expiration: ภาพรวม

Redis เก็บข้อมูลทั้งหมดไว้ใน RAM ทำให้ทำงานได้รวดเร็วมาก แต่ RAM นั้นไม่ถาวร — ปิดเครื่องเมื่อไหร่ข้อมูลก็หายไป เพื่อให้ข้อมูลอยู่รอดหลังจาก restart Redis จึงมีกลไก persistence สองแบบที่ทำงานเสริมกัน โดยเขียนข้อมูลลงดิสก์

คุณสามารถเลือกใช้แบบใดแบบหนึ่ง ทั้งสอง หรือไม่ใช้เลย ขึ้นอยู่กับกรณีการใช้งาน cache ล้วน ๆ อาจไม่ต้องการ persistence เลย แต่ session store หรือ primary database ควรใช้ทั้งสองแบบ

RDB (Redis Database) ถ่าย snapshot ของชุดข้อมูลทั้งหมด ณ เวลาหนึ่ง แล้วบันทึกลงไฟล์ binary ชื่อ dump.rdb Snapshot จะถูกเรียกโดยอัตโนมัติตาม threshold ที่กำหนดได้ (เช่น “มีการเปลี่ยนแปลงอย่างน้อย 100 key ในช่วง 5 นาทีที่ผ่านมา”) หรือสั่งด้วยตนเองด้วย BGSAVE RDB มีขนาดกะทัดรัดและโหลดได้เร็วตอน restart แต่อาจสูญเสียข้อมูลที่เขียนหลัง snapshot ล่าสุดได้

AOF (Append-Only File) บันทึกคำสั่งเขียนทุกคำสั่งที่เซิร์ฟเวอร์รับเข้ามาลงในไฟล์ชื่อ appendonly.aof เมื่อ restart Redis จะเล่นซ้ำ log เพื่อสร้างชุดข้อมูลขึ้นใหม่ AOF ให้ความทนทานที่ละเอียดกว่ามาก — ด้วย appendfsync everysec คุณจะสูญเสียข้อมูลได้มากที่สุดเพียงหนึ่งวินาที ข้อเสียคือไฟล์มีขนาดใหญ่กว่าและ restart ช้ากว่าเล็กน้อย

Redis ช่วยให้คุณแนบเวลา time-to-live กับ key ใด ๆ ด้วย EXPIRE (วินาที) หรือ PEXPIRE (มิลลิวินาที) เมื่อ TTL หมดอายุ key จะถูกลบโดยอัตโนมัติ ใช้ TTL เพื่อตรวจสอบเวลาที่เหลือ และ PERSIST เพื่อลบ expiration ออกและทำให้ key อยู่ถาวร

เมื่อ Redis หมดหน่วยความจำก็ต้องตัดสินใจว่าจะทำอย่างไร Eviction policies ควบคุมสิ่งนี้: noeviction คืนค่า error, allkeys-lru ลบ key ที่ใช้น้อยที่สุดในทุก key, volatile-lru ลบ key LRU เฉพาะในกลุ่ม key ที่มี TTL ตั้งไว้ เป็นต้น Policy ที่เหมาะสมขึ้นอยู่กับว่า Redis ทำหน้าที่เป็น cache หรือ primary store

#บทเรียนหัวข้อที่ครอบคลุม
1Persistence & Expiration: Overview (หน้านี้)RDB, AOF, TTL, eviction — ภาพรวม
2RDB Snapshots and AOFBGSAVE, BGREWRITEAOF, config directives, hybrid mode
3Key Expiration and TTLEXPIRE, PEXPIRE, TTL, PERSIST, lazy vs active expiry
4Eviction Policiesmaxmemory, LRU/LFU policies, noeviction, cache tuning
5Persistence in Practiceการเลือก strategy ที่เหมาะสม, การมอนิเตอร์, backup scripts

โค้ดด้านล่างตั้ง key พร้อม TTL 30 วินาที ตรวจสอบ TTL ที่เหลือ แล้วลบ expiration ออกเพื่อทำให้ key อยู่ถาวร

127.0.0.1:6379> SET session:demo "hello" EX 30
OK
127.0.0.1:6379> TTL session:demo
(integer) 30
127.0.0.1:6379> PERSIST session:demo
(integer) 1
127.0.0.1:6379> TTL session:demo
(integer) -1

TTL คืนค่า -1 เมื่อ key มีอยู่แต่ไม่มี expiration และ -2 เมื่อ key ไม่มีอยู่เลย

SET session:demo "hello" EX 30
TTL session:demo
PERSIST session:demo
TTL session:demo
Redis เขียน RDB snapshot ลงไฟล์ชื่ออะไรโดยค่าเริ่มต้น?
TTL ที่มีค่า -2 ซึ่งคืนมาจากคำสั่ง TTL หมายความว่าอะไร?
คำสั่งใดที่ลบการหมดอายุออกจาก key ทำให้เป็น permanent?