Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

Redis Replicas ข้าม Expired Keys: ทำไมจำนวนคีย์ถึงลดลง

หากคุณใช้ expiring keys (ที่รู้จักในชื่อ "volatile keys") ใน Redis คุณอาจได้รับความประหลาดใจเมื่อแนบ Redis replica ใหม่เข้ากับฐานข้อมูล: จำนวนคีย์บน replica ของคุณอาจต่ำกว่าจำนวนคีย์บน primary DB อย่างมีนัยสำคัญ นี่พบได้บ่อยโดยเฉพาะหากคุณมี volatile keys จำนวนมาก

Redis replica ของคุณขาดคีย์หรือไม่? คุณเพิ่งสูญเสียข้อมูลหรือไม่? คำตอบสั้นคือ "ไม่" อย่างไรก็ตาม การเข้าใจว่าทำไม Redis replica ของคุณรายงานจำนวนคีย์ต่ำกว่าแม้คุณจะไม่ได้สูญเสียข้อมูล จะช่วยได้มาก นี่เกี่ยวข้องกับรายละเอียดการนำไปใช้สองประการ: วิธีที่ Redis หมดอายุคีย์ และวิธีที่ Redis ส่ง dataset ไปยัง replicas ใหม่

Redis หมดอายุ volatile keys ยังไง?

ใน Redis volatile keys ไม่ถูกลบออกจากหน่วยความจำในทันทีที่ตั้งค่าหมดอายุ แต่ถูกลบผ่านสองวิธี:

  1. เมื่อ Redis client ดำเนินการอ่านหรือเขียนบนคีย์ เซิร์ฟเวอร์ Redis จะตรวจสอบก่อนว่าคีย์นั้นมีอยู่และมีเวลาหมดอายุหรือไม่ หากมีอยู่และหมดอายุแล้ว (เวลาในอดีต) Redis จะ expunge (ลบออก) คีย์ทันทีก่อนจัดการคำสั่ง

  2. เพื่อป้องกัน volatile keys ค้างอยู่ในหน่วยความจำนานถ้าไม่ถูกเข้าถึง Redis ใช้อัลกอริทึม passive เรียบง่าย: ทุก 10 มิลลิวินาที จะสุ่มหยิบ 100 volatile keys และ expunge ทันทีคีย์ที่หมดอายุแล้ว หาก expunge ไป 25 คีย์ขึ้นไป Redis จะหยิบ 100 keys ใหม่และเริ่มใหม่ทันที

วิธีที่สองข้างต้นสำคัญ เพราะหมายความว่าอาจมีจำนวนคีย์มากที่เป็น volatile keys ที่ "หมดอายุ" แล้วแต่ยังไม่ถูก expunge ออกจากหน่วยความจำ1 Redis จะยังนับคีย์เหล่านี้รวมใน "keys" และ "expires" counts ใน INFO output จนกว่าจะถูก expunge

Redis ส่ง dataset ไปยัง replicas ใหม่ยังไง?

เมื่อ Redis replica แนบตัวเข้ากับ Redis server เซิร์ฟเวอร์ primary จะสร้าง RDB snapshot ของ dataset และส่งไปยัง replica และเมื่อ Redis สร้าง RDB snapshots มัน ไม่รวมคีย์ใดๆ ที่มี expiration dates ในอดีต แม้จะยังไม่ถูก expunge จากหน่วยความจำ

ทำไมจำนวนคีย์ของ replica ต่ำกว่า primary server?

เมื่อคุณแนบ replica เข้ากับ Redis instance replica นั้นจะได้รับ dataset ที่ไม่รวม volatile keys ที่หมดอายุแล้ว (แต่ยังคงอยู่) จาก primary database นี่คือเหตุผลเดียวกันที่จำนวนคีย์อาจลดลงเมื่อ restore Redis server จาก RDB backup

ขอบคุณพิเศษ @mattsta ช่วยติดตามพฤติกรรม RDB

  1. ในทางปฏิบัติ จำนวนนี้มักต่ำกว่านี้มาก เนื่องจาก Redis กำลังมองหาคีย์ให้ลบทุกเวลา ↩