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

ขีดจำกัดหน่วยความจำและ Eviction

maxmemory จำกัดการใช้หน่วยความจำของ Redis เมื่อถึงขีดจำกัด Redis จะใช้นโยบาย eviction เพื่อตัดสินใจว่าจะลบ key ใด คุณสามารถตั้งค่าได้ใน redis.conf หรือที่ runtime ด้วย CONFIG SET

maxmemory 512mb
maxmemory-policy allkeys-lru
นโยบายพฤติกรรม
noevictionคืนค่า error เมื่อเขียนและหน่วยความจำเต็ม (ค่าเริ่มต้น; ปลอดภัยสำหรับฐานข้อมูล)
allkeys-lruลบ key ที่ใช้งานน้อยที่สุดล่าสุดจากทุก key
volatile-lruลบ LRU จาก key ที่มี TTL กำหนด
allkeys-lfuลบ key ที่ใช้งานน้อยที่สุดจากทุก key
volatile-lfuลบ LFU จาก key ที่มี TTL
volatile-ttlลบ key ที่มี TTL เหลือน้อยที่สุด
allkeys-randomลบ key แบบสุ่มจากทุก key
volatile-randomลบ key แบบสุ่มจาก key ที่มี TTL
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 256mb
OK
CONFIG GET maxmemory-policy
CONFIG SET maxmemory-policy allkeys-lru
CONFIG GET maxmemory
CONFIG SET maxmemory 256mb
ตัวเลือกBenefitCost
noevictionไม่มี key ไหนถูกลบโดยไม่ตั้งใจ ปลอดภัยสำหรับข้อมูลถาวรเขียนล้มเหลวทันทีด้วย error เมื่อหน่วยความจำเต็ม ต้อง monitor maxmemory เอง
allkeys-lru / allkeys-lfuRedis จัดการหน่วยความจำเองอัตโนมัติ เหมาะกับ pure-cache workloadอาจลบ key ที่ยังต้องการอยู่ถ้าประเมิน “ใช้งานน้อย” ผิดพลาด ไม่เหมาะกับข้อมูลที่ต้องอยู่ถาวร
volatile-* (lru/lfu/ttl/random)ลบเฉพาะ key ที่มี TTL เท่านั้น ข้อมูลถาวรปลอดภัยถ้า key ทั้งหมดไม่มี TTL policy นี้จะทำงานเหมือน noeviction และเขียนล้มเหลวเมื่อเต็ม
  • รัน production cache ด้วย noeviction — เมื่อหน่วยความจำเต็ม การเขียนทุกครั้งจะได้ error OOM command not allowed แทนที่จะปล่อยให้ Redis ลบ key เก่าออกเองตามที่ cache ควรทำ
  • ใช้ allkeys-lru กับข้อมูลที่ต้องอยู่ถาวร — ถ้า Redis ถูกใช้เป็นทั้ง cache และที่เก็บข้อมูลสำคัญในฐานเดียวกัน นโยบาย allkeys-* อาจลบ key สำคัญทิ้งเมื่อหน่วยความจำตึง ควรแยก instance หรือใช้ volatile-* แทน
  • ไม่ตั้ง maxmemory เลย — ถ้าไม่ได้กำหนดขีดจำกัด Redis จะใช้หน่วยความจำเท่าที่ระบบมี จนกระทั่ง OS เริ่ม kill process หรือระบบล่มโดยไม่มีการเตือนล่วงหน้า

💡 ตัวอย่างจากของจริง

Instagram — ใช้ Redis fleet จำนวนมากที่ตั้งค่า allkeys-lru เป็นมาตรฐานสำหรับ cache layer เพื่อให้ระบบจัดการหน่วยความจำเองโดยไม่ต้องเขียน eviction logic เอง

Stack Overflow — แยก Redis instance สำหรับ cache (ตั้ง allkeys-lru) ออกจาก instance ที่เก็บข้อมูลสำคัญ (ตั้ง noeviction) เพื่อไม่ให้ policy ผิดประเภทกระทบข้อมูลที่ห้ามหาย

นโยบาย eviction ใดที่ลบ key ที่ใช้งานน้อยที่สุดล่าสุดจากทุก key?
นโยบาย eviction เริ่มต้นใน Redis คืออะไร?
นโยบาย `volatile-ttl` ลบ key ตามเกณฑ์ใด?
คำสั่งใดที่ตั้งค่านโยบาย eviction ที่ runtime?