หากคุณใช้คีย์ที่ใกล้หมดอายุ (หรือที่เรียกว่า "ระเหย") ใน Redis คุณอาจแปลกใจเมื่อคุณแนบแบบจำลอง Redis ใหม่เข้ากับฐานข้อมูลของคุณ:จำนวนคีย์บนแบบจำลองของคุณอาจต่ำกว่าจำนวนคีย์บนฐานข้อมูลหลักของคุณอย่างมาก . ซึ่งเป็นเรื่องปกติโดยเฉพาะอย่างยิ่งถ้าคุณมีคีย์ที่ระเหยได้จำนวนมาก
แบบจำลอง Redis ของคุณไม่มีคีย์หรือไม่ คุณเพิ่งสูญเสียข้อมูล? คำตอบสั้นๆ คือ “ไม่” อย่างไรก็ตาม คุณควรทำความเข้าใจว่าทำไม แบบจำลอง Redis ของคุณจึงรายงานจำนวนคีย์ที่ต่ำกว่า แม้ว่าคุณจะไม่ได้สูญเสียข้อมูลใดๆ ก็ตาม สิ่งนี้เกี่ยวข้องกับรายละเอียดการใช้งาน 2 แบบ:วิธีที่ Redis หมดอายุคีย์และวิธีที่ Redis ส่งชุดข้อมูลของคุณไปยังแบบจำลองใหม่
Redis หมดอายุคีย์ที่ระเหยง่ายได้อย่างไร
ใน Redis คีย์ที่ระเหยได้จะไม่ถูกลบออกจากหน่วยความจำในช่วงเวลาที่แน่นอนที่ถูกกำหนดให้หมดอายุ แต่จะถูกลบด้วยวิธีใดวิธีหนึ่งจากสองวิธี:
-
เมื่อไคลเอ็นต์ Redis ดำเนินการอ่านหรือเขียนคีย์ เซิร์ฟเวอร์ Redis จะตรวจสอบก่อนว่าคีย์นั้นมีอยู่จริงหรือไม่และมีเวลาหมดอายุ หากมีและมีเวลาหมดอายุในอดีต Redis จะล้างคีย์ออกจากหน่วยความจำทันที ก่อนจัดการคำสั่ง
-
เพื่อป้องกันไม่ให้คีย์ที่ระเหยง่ายติดอยู่ในหน่วยความจำอย่างถาวรหากไม่มีการเข้าถึง Redis ใช้อัลกอริธึมแบบพาสซีฟอย่างง่ายเพื่อทำให้คีย์หมดอายุ:ทุกๆ 10 มิลลิวินาที มันจะหยิบคีย์สุ่ม 100 คีย์ที่ระเหยง่าย และกำจัดคีย์ใดๆ ที่เลยเวลาหมดอายุออกทันที หากมีคีย์ 25 อันขึ้นไปถูกล้างข้อมูล ให้รีบคว้าอีก 100 คีย์และเริ่มต้นใหม่อีกครั้ง
วิธีที่สองข้างต้นมีความสำคัญเนื่องจากหมายความว่าคีย์จำนวนมากอาจเป็นคีย์ที่ระเหยได้ซึ่ง "หมดอายุ" แล้ว แต่ยังไม่ถูกลบออกจากหน่วยความจำเลย1
. Redis จะยังคงรวมคีย์เหล่านี้ในการนับ "คีย์" และ "หมดอายุ" ใน INFO
ของคุณ จนกว่าจะถูกลบออก
Redis ส่งชุดข้อมูลไปยังแบบจำลองใหม่อย่างไร
เมื่อแบบจำลอง Redis เชื่อมต่อกับเซิร์ฟเวอร์ Redis เซิร์ฟเวอร์หลักจะสร้างสแน็ปช็อต RDB ของชุดข้อมูลและส่งไปยังแบบจำลอง และเมื่อ Redis สร้างสแนปชอต RDB จะไม่รวมคีย์ที่มีวันที่หมดอายุในอดีต แม้ว่าจะยังไม่ถูกลบออกจากความทรงจำก็ตาม
แล้วเหตุใดคีย์ของแบบจำลองจึงนับน้อยกว่าเซิร์ฟเวอร์หลัก
เมื่อคุณแนบแบบจำลองกับอินสแตนซ์ Redis แบบจำลองนั้นจะได้รับชุดข้อมูลที่ไม่มีคีย์ระเหยที่หมดอายุ (แต่ยังคงหลงเหลืออยู่) จากฐานข้อมูลหลัก นี่เป็นสาเหตุเดียวกับที่จำนวนคีย์ของคุณอาจลดลงเมื่อกู้คืนเซิร์ฟเวอร์ Redis จากการสำรองข้อมูล anRDB
ขอขอบคุณ @mattsta เป็นพิเศษสำหรับความช่วยเหลือในการติดตามพฤติกรรม RDB
-
ในทางปฏิบัติ ตัวเลขนี้มักจะต่ำกว่ามากเนื่องจาก Redis มองหาคีย์ที่จะลบอยู่ตลอดเวลา ↩