Redis ยังคงมีข้อมูลอยู่หรือไม่


122

ฉันเข้าใจว่า Redis ให้บริการข้อมูลทั้งหมดจากหน่วยความจำ แต่ยังคงมีอยู่เช่นกันในการรีบูตเซิร์ฟเวอร์ดังนั้นเมื่อเซิร์ฟเวอร์รีบูตเครื่องจะอ่านข้อมูลทั้งหมดจากดิสก์ในหน่วยความจำ หรือมักจะเป็นที่เก็บข้อมูลว่างเปล่าซึ่งเป็นเพียงการจัดเก็บข้อมูลในขณะที่แอปกำลังทำงานโดยไม่มีการคงอยู่?


1
ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณถูกต้องหรือไม่ คุณสามารถบันทึกสแนปชอตลงในดิสก์และอ่านจากไฟล์นั้นได้หากคุณไม่ทำฐานข้อมูล redis ของคุณจะว่างเปล่าเมื่อรีบูต
Sefa

คำตอบ:


82

ผมขอแนะนำให้คุณอ่านเกี่ยวกับเรื่องนี้เมื่อวันที่http://redis.io/topics/persistence โดยทั่วไปคุณจะสูญเสียความคงอยู่ที่รับประกันเมื่อคุณเพิ่มประสิทธิภาพโดยใช้การจัดเก็บในหน่วยความจำเท่านั้น ลองนึกภาพสถานการณ์ที่คุณใส่เข้าไปในหน่วยความจำ แต่ก่อนที่มันจะยังคงอยู่ที่ดิสก์จะสูญเสียพลังงาน จะมีข้อมูลสูญหาย

Redis รองรับสิ่งที่เรียกว่า "สแนปชอต" ซึ่งหมายความว่าจะทำสำเนา whats ในหน่วยความจำอย่างสมบูรณ์ในบางช่วงเวลา (เช่นทุกชั่วโมงเต็ม) เมื่อคุณสูญเสียพลังงานระหว่างสองสแน็ปช็อตคุณจะสูญเสียข้อมูลจากช่วงเวลาระหว่างสแนปช็อตล่าสุดและการขัดข้อง (ไม่จำเป็นต้องเป็นไฟดับ .. ) Redis แลกเปลี่ยนความปลอดภัยของข้อมูลเทียบกับประสิทธิภาพเช่นเดียวกับ NoSQL-DBs ส่วนใหญ่ทำ

ฐานข้อมูล NoSQL ส่วนใหญ่เป็นไปตามแนวคิดของการจำลองแบบระหว่างโหนดต่างๆเพื่อลดความเสี่ยงนี้ Redis ถือเป็นแคชที่รวดเร็วมากกว่าฐานข้อมูลที่รับประกันความสอดคล้องของข้อมูล ดังนั้นกรณีการใช้งานจึงแตกต่างจากฐานข้อมูลจริงตัวอย่างเช่นคุณสามารถจัดเก็บเซสชันตัวนับประสิทธิภาพหรืออะไรก็ได้ที่มีประสิทธิภาพที่ไม่ตรงกันและไม่มีการสูญเสียจริงในกรณีที่เกิดข้อขัดข้อง แต่การประมวลผลใบสั่งซื้อ / ประวัติการซื้อและอื่น ๆ ถือเป็นงานสำหรับฐานข้อมูลแบบดั้งเดิม


1
จะเป็นการดีมากหากคุณสามารถเพิ่มพฤติกรรมการคงอยู่เริ่มต้นได้ ชอบคำตอบของ @Leonid Beschastny
จ้ะ

40

เซิร์ฟเวอร์ Redis บันทึกข้อมูลทั้งหมดลงใน HDD เป็นครั้งคราวจึงให้ความคงอยู่ในระดับหนึ่ง

บันทึกข้อมูลในกรณีต่อไปนี้:

  • โดยอัตโนมัติเป็นครั้งคราว
  • เมื่อคุณเรียกใช้คำสั่งด้วยตนเองBGSAVE
  • เมื่อ redis กำลังปิดเครื่อง

แต่ข้อมูลใน redis ไม่คงอยู่จริงๆเนื่องจาก:

  • ความผิดพลาดของกระบวนการ redis หมายถึงการสูญเสียการเปลี่ยนแปลงทั้งหมดตั้งแต่บันทึกครั้งสุดท้าย
  • BGSAVE การดำเนินการสามารถทำได้ก็ต่อเมื่อคุณมี RAM ว่างเพียงพอ (จำนวน RAM เพิ่มเติมจะเท่ากับขนาดของ redis DB)

หมายเหตุ: BGSAVEความต้องการ RAM เป็นปัญหาที่แท้จริงเนื่องจาก redis ยังคงทำงานต่อไปจนกว่าจะไม่มี RAM ให้ทำงานอีกต่อไป แต่จะหยุดบันทึกข้อมูลลงใน HDD เร็วกว่ามาก (ที่ประมาณ 50% ของ RAM)

สำหรับข้อมูลเพิ่มเติมโปรดดูที่Redis คงทน


1
เนื่องจากคำตอบนี้ถูกเขียนขึ้น redis จึงแนะนำรูปแบบการคงอยู่ทางเลือกที่เรียกว่า AOF ซึ่งให้การคงอยู่ที่สูงขึ้นอย่างมีนัยสำคัญ แต่มีข้อเสียอื่น ๆ เช่นการใช้ดิสก์ที่สูงขึ้นและการเริ่มต้นเซิร์ฟเวอร์ช้าลง
Leonid Beschastny

16

มันเป็นเรื่องของการกำหนดค่า คุณสามารถไม่มีการคงอยู่ของข้อมูลของคุณบางส่วนหรือทั้งหมดใน Redis ได้ การตัดสินใจที่ดีที่สุดจะขับเคลื่อนโดยความต้องการด้านเทคนิคและธุรกิจของโครงการ

ตามเอกสารของ Redis เกี่ยวกับการคงอยู่คุณสามารถตั้งค่าอินสแตนซ์ของคุณเพื่อบันทึกข้อมูลลงในดิสก์เป็นครั้งคราวหรือในแต่ละแบบสอบถามโดยสรุป มีสองกลยุทธ์ / วิธีการ AOF และ RDB (อ่านเอกสารประกอบเพื่อดูรายละเอียดเกี่ยวกับตอนนั้น) คุณสามารถใช้แต่ละกลยุทธ์เพียงอย่างเดียวหรือร่วมกัน

หากคุณต้องการ "SQL like persistence" พวกเขาได้กล่าวว่า:

ข้อบ่งชี้ทั่วไปคือคุณควรใช้ทั้งสองวิธีการคงอยู่หากคุณต้องการระดับความปลอดภัยของข้อมูลเทียบเท่ากับที่ PostgreSQL สามารถให้คุณได้


7

โดยทั่วไปคำตอบคือใช่อย่างไรก็ตามคำตอบที่สมบูรณ์ขึ้นอยู่กับประเภทของข้อมูลที่คุณพยายามจัดเก็บ โดยทั่วไปคำตอบสั้น ๆ ที่สมบูรณ์กว่าคือ:

  • Redis ไม่เหมาะที่สุดสำหรับพื้นที่จัดเก็บข้อมูลถาวรเนื่องจากเน้นประสิทธิภาพเป็นหลัก
  • Redis เหมาะสำหรับการจัดเก็บ / แคชข้อมูลสถานะปัจจุบันในหน่วยความจำที่เชื่อถือได้มากขึ้นโดยเฉพาะอย่างยิ่งสำหรับการอนุญาตให้ปรับขนาดได้โดยให้แหล่งข้อมูลกลางสำหรับข้อมูลที่ใช้ในไคลเอนต์ / เซิร์ฟเวอร์หลายตัว

เมื่อพูดอย่างนี้โดยค่าเริ่มต้น Redis จะคงสแนปชอตข้อมูลในช่วงเวลาหนึ่ง (เห็นได้ชัดว่านี่คือทุกๆ 1 นาที แต่ฉันยังไม่ได้ตรวจสอบสิ่งนี้ - อธิบายไว้ในบทความด้านล่างซึ่งเป็นบทนำพื้นฐานที่ดี):

http://qnimate.com/redis-permanent-storage/


TL; DR

จากเอกสารอย่างเป็นทางการ :

  • การคงอยู่ของ RDB [ค่าเริ่มต้น] จะดำเนินการสแนปชอตแบบจุดต่อเวลาของชุดข้อมูลของคุณตามช่วงเวลาที่กำหนด
  • การคงอยู่ของ AOF [จำเป็นต้องกำหนดค่าอย่างชัดเจน]บันทึกทุกการดำเนินการเขียนที่ได้รับจากเซิร์ฟเวอร์ซึ่งจะเล่นอีกครั้งเมื่อเริ่มต้นเซิร์ฟเวอร์โดยสร้างชุดข้อมูลเดิมขึ้นมาใหม่

Redis ต้องได้รับการกำหนดค่าอย่างชัดเจนสำหรับการคงอยู่ของ AOF หากจำเป็นและจะส่งผลให้เกิดการลงโทษด้านประสิทธิภาพรวมถึงบันทึกที่เพิ่มขึ้น อาจเพียงพอสำหรับการคงอยู่ของการไหลของข้อมูลในปริมาณที่ จำกัด


5

คุณสามารถเลือกไม่คงอยู่ได้เลยประสิทธิภาพที่ดีขึ้น แต่ข้อมูลทั้งหมดจะหายไปเมื่อ Redis ปิดตัวลง

Redis มีกลไกการคงอยู่สองแบบ: RDB และ AOF RDB ใช้ global snapshooting ของตัวกำหนดตารางเวลาและ AOF เขียนอัพเดตไปยังล็อกไฟล์ apappend-only ที่คล้ายกับ MySql

คุณสามารถใช้หนึ่งในนั้นหรือทั้งสองอย่างเมื่อ Redis รีบูตระบบจะสร้างข้อมูลจากการอ่านไฟล์ RDB หรือไฟล์ AOF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.