ขีดจำกัดหน่วยความจำและ Eviction
การกำหนดขีดจำกัดหน่วยความจำ
หัวข้อที่มีชื่อว่า “การกำหนดขีดจำกัดหน่วยความจำ”maxmemory จำกัดการใช้หน่วยความจำของ Redis เมื่อถึงขีดจำกัด Redis จะใช้นโยบาย eviction เพื่อตัดสินใจว่าจะลบ key ใด คุณสามารถตั้งค่าได้ใน redis.conf หรือที่ runtime ด้วย CONFIG SET
maxmemory 512mbmaxmemory-policy allkeys-lruนโยบาย Eviction
หัวข้อที่มีชื่อว่า “นโยบาย Eviction”| นโยบาย | พฤติกรรม |
|---|---|
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 |
การตรวจสอบและเปลี่ยนนโยบายที่ runtime
หัวข้อที่มีชื่อว่า “การตรวจสอบและเปลี่ยนนโยบายที่ runtime”127.0.0.1:6379> CONFIG GET maxmemory-policy1) "maxmemory-policy"2) "noeviction"127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lruOK127.0.0.1:6379> CONFIG GET maxmemory1) "maxmemory"2) "0"127.0.0.1:6379> CONFIG SET maxmemory 256mbOKCONFIG GET maxmemory-policy
CONFIG SET maxmemory-policy allkeys-lru
CONFIG GET maxmemory
CONFIG SET maxmemory 256mbข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
noeviction | ไม่มี key ไหนถูกลบโดยไม่ตั้งใจ ปลอดภัยสำหรับข้อมูลถาวร | เขียนล้มเหลวทันทีด้วย error เมื่อหน่วยความจำเต็ม ต้อง monitor maxmemory เอง |
allkeys-lru / allkeys-lfu | Redis จัดการหน่วยความจำเองอัตโนมัติ เหมาะกับ pure-cache workload | อาจลบ key ที่ยังต้องการอยู่ถ้าประเมิน “ใช้งานน้อย” ผิดพลาด ไม่เหมาะกับข้อมูลที่ต้องอยู่ถาวร |
volatile-* (lru/lfu/ttl/random) | ลบเฉพาะ key ที่มี TTL เท่านั้น ข้อมูลถาวรปลอดภัย | ถ้า key ทั้งหมดไม่มี TTL policy นี้จะทำงานเหมือน noeviction และเขียนล้มเหลวเมื่อเต็ม |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- รัน production cache ด้วย
noeviction— เมื่อหน่วยความจำเต็ม การเขียนทุกครั้งจะได้ errorOOM 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 ผิดประเภทกระทบข้อมูลที่ห้ามหาย